1

私は MongoDb の c++ ドライバーを使用しており、mongo::Query クラスと JSON クエリを文字列として組み合わせようとしています。

私の例では、q1、q2、q3 を結合しようとしています。q3 を mongo::fromjson(q3); に変換できます。最後の結合の前に不要なエラーをキャッチするための try catch では、それが最善の方法であるかどうかはわかりません。

これまでのところ、私の唯一の試みは、BSON_ARRAY を使用して個別のセクションを結合することですが、それでも私が望むようにはなりません (ただし、安定していません)。

///The output im trying to achieve is:
// {a : 1,b : 2, c : 3}

const mongo::Query q1 = QUERY("a" << 1);
const mongo::Query q2 = QUERY("b" << 2);
const std::string q3 = "{c : 3}";

// Attempt 1. I know it does not work.
mongo::Query qAll = BSON_ARRAY(q1.toString() << q2.toString());

std::cout << q1.toString() << std::endl;
// Outputs { a: 1 } as expected

std::cout << q2.toString() << std::endl;
// Outputs { b: 2 } as expected

std::cout << qAll.toString() << std::endl;
// Outputs { 0: "{ a: 1 }", 1: "{ b: 2 }" }, expected but wrong.
4

2 に答える 2

1

私が見た BSONObjBuilder の使用を避けることはできませんが、BSONObjBuilder が提供する API をより有効に活用することで、生活を少し楽にすることができます。

const mongo::Query q1 = QUERY("a" << 1);
const mongo::Query q2 = QUERY("b" << 2);
const std::string q3 = "{c : 3}";

mongo::BSONObjBuilder builder;
builder.appendElements(q1.getFilter());
builder.appendElements(q2.getFilter());
builder.appendElements(mongo::fromjson(q3));
const mongo::Query qAll(builder.obj());

std::cout << qAll.toString() << std::endl;
于 2013-01-14T23:00:25.483 に答える
0

これまでのところ、これは私が思いついた最もエレガントな方法です。何か考えや提案はありますか?

mongo::Query combineQueries(const mongo::Query q1, const mongo::Query q2) {
    mongo::BSONObjBuilder obAll;
    mongo::BSONObjIterator ii = q1.getFilter().begin();
    while (ii.more()) {
        obAll.append(ii.next());
    }

    ii = q2.getFilter().begin();
    while (ii.more()) {
        obAll.append(ii.next());
    }

    return obAll.obj();
}
于 2013-01-14T21:59:49.037 に答える