繁体   English   中英

在C ++驱动程序中结合mongo :: Query

[英]Combining mongo::Query in c++ driver

我正在使用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.

您不能避免使用我看到的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;

到目前为止,这是我到目前为止提出的最优雅的方法,有什么想法/建议吗?

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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM