我正在使用MongoDb的c ++驱动程序并尝试将mongo :: Query类与JSON查询组合为一个字符串。
在我的例子中,我试图结合q1,q2,q3。我可以将q3转换为mongo :: fromjson(q3);尝试捕获以在最终组合之前捕获不需要的错误,但我不确定这是否是最好的方法。
到目前为止,我唯一的尝试是使用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.
答案 0 :(得分: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;
答案 1 :(得分: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();
}