1

サブルーチンで次のコードを使用して $or BSON クエリを作成しようとしています。

bson * outBson = bson_create();
bson_init(outBson);

    bson_append_start_object(outBson, "$query");
        bson_append_start_array(outBson, "$or");
            bson_append_int(outBson, "cpu", 2000);
            bson_append_int(outBson, "ram", 4096);
        bson_append_finish_array(outBson);
    bson_append_finish_object(outBson);

bson_finish(outBson);

bson_print(outBson);

しかし、mongo_find() から返されたカーソルとして NULL を取得しています。接続 mongo->errstr および mongo->err コードをダンプしようとしましたが、どちらも空で 0 です。

bson_append_start/finish_array() を取り出して、基本的に $and クエリとして変更すると、機能します。(残念ながら $and は私がやろうとしていたことではありません...)

Cドライバーを介して適切な複合クエリBSONを構築する方法を誰かが教えてくれれば幸いです。

Mongo シェルから、私のデータは次のようになります。

> db.test.find()
{ "_id" : ObjectId("507d20a72dfd5c5c2534d068"), "cpu" : 1600 }
{ "_id" : ObjectId("507d23602dfd5c5c2534d069"), "cpu" : 2000 }
{ "_id" : ObjectId("507d236c2dfd5c5c2534d06a"), "cpu" : 1666 }
{ "_id" : ObjectId("507d23712dfd5c5c2534d06b"), "cpu" : 2333 }
{ "_id" : ObjectId("507d254eef456cca26234013"), "cpu" : 2000, "ram" : 4096 }
> db.test.find( { $or : [ {"cpu" : 1666}, {"cpu" : 2000} ] } )
{ "_id" : ObjectId("507d23602dfd5c5c2534d069"), "cpu" : 2000 }
{ "_id" : ObjectId("507d236c2dfd5c5c2534d06a"), "cpu" : 1666 }
{ "_id" : ObjectId("507d254eef456cca26234013"), "cpu" : 2000, "ram" : 4096 }

ありがとう。

4

1 に答える 1

0

さて、多くの実験とソースの調査の後、bson_append_int( bson *b, const char *name, const int i ) は実際には int 型のオブジェクトを追加しないことがわかりました。

上記の構造の bson_print() で得たものは次のとおりです。

$or : 4      
    cpu : 16     2000
    ram : 16     4096

4 と 16 は、それぞれ 'array' 型と 'int' 型であることを示しています... int には ("cpu" と "ram") という名前が付いていますが、それらはオブジェクトではありません。

実際に機能したのは、次のような匿名ではないオブジェクト ラッパーを提供することでした。

bson_init(outBson);

bson_append_start_array(outBson, "$or");

    bson_append_start_object(outBson, "0");
        bson_append_int(outBson, "cpu", 2000);
    bson_append_finish_object(outBson);

    bson_append_start_object(outBson, "1");
        bson_append_int(outBson, "ram", 4096);
    bson_append_finish_object(outBson);

bson_append_finish_object(outBson);

bson_finish(outBson);
于 2012-10-17T02:51:20.627 に答える