2016-12-28 8 views
0

MongoDB cxxレガシードライバBSONBuilderを使用して$ inクエリを作成しようとしています。今まで、私は私のMongoDBのコレクションから単一のドキュメントをロードするための簡単なID =「...」クエリを作成するには、次のコードを使用しています:

BSONObjBuilder b; 
b.append("_ID", "..."); 
BSONObj p = b.obj(); 

今、私は、例えば、クエリを生成したいと思います

{ field: { $in: [<value1>, <value2>, ... <valueN> ] } } 

とインターフェースを介して文書の範囲を得るためにそれを使用する:あなたの誰かがBSONObjBuilderを使用してクエリで$を構築する方法を

... 

auto_ptr<DBClientCursor> cursor = c.query("tutorial.persons", p); 

while (cursor->more()) 
cout << cursor->next().toString() << endl; 

.... 

知っていますか?または、クエリで別のトリックがあるとIDで1つのクエリで10のドキュメントを言うことができますか?

ありがとうございました。

更新:

私は次のスニペットを試しました。

mongo::BSONObjBuilder oBuilder; 
// oBuilder.append(STR_FIELD_PARENT_ITEM_ID, aIDs); 

mongo::BSONArrayBuilder oJsonIDarr; 
for(unsigned int ii = 0; ii < aIDs.size(); ii++) { 
    oJsonIDarr << aIDs[ii]; 
} 

oBuilder.append("$in", oJsonIDarr.arr()); 

BOOSTER_WARNING("Comment_Mongo") << "query: " << oBuilder.obj(); 

mongo::BSONObjBuilder oQueryObj; 
oQueryObj.append(STR_FIELD_ID, oBuilder.obj()); 

BOOSTER_WARNING("Comment_Mongo") << "query: " << oQueryObj.obj(); 

最初のクエリobjは次のようになります。

query: { $in: [ "585c27f903733890966a618d", "585c278ed7cd3684afe5b495" ] } 

とすぐに/ドライバをMongoDBのために送られたとして、例外がスローされます。..

第二には、次のクエリを出力します。

query: { _id: {} } 

私は任意のティップについて満足しています!どうもありがとう!

答えて

0

以下のように試すことができます。

BSONObjBuilder b; 
BSONArrayBuilder bab; 
bab.append("val"); 
b.append("$in", bab.arr())); 
BSONObjBuilder id; 
id.append("_id", b.done()); 
BSONObj p = b.obj(); 
+0

こんにちはサガール、答えをありがとう!私はそれを試しただけですが、 "{$ in:[、... ]}"部分を生成します。 "フィールド"を追加する方法も知っていますか?再度、感謝します! – AlexM

+0

更新されました。それが役立つかどうかを見てください。 – Veeram

+0

こんにちは、私のソースでそれを変更しました。 "b.done()"という行に達するとすぐにSIGSEGV(Segmentation fault)を投げます。別のアイデアはありますか? >あなたの助けをありがとう! – AlexM

関連する問題