2013-01-14 103 views
1

我使用MongoDB的C++驱动程序,并试图蒙戈::查询类,使用JSON作为查询字符串一起结合起来。结合蒙戈::查询在C++驱动

在我的例子我试图Q1,Q2,Q3合并。我可以将q3转换为mongo :: fromjson(q3);在尝试赶在最终结合之前捕获不想要的错误,但我不确定这是否是最好的方式来做到这一点。

到目前为止,我只尝试使用BSON_ARRAY到独立的部分结合起来,但是这仍然是不出来我想(understably虽然)的方式。

///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. 

回答

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; 
+0

好,它的一点清洁感谢。 –

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