1

我正在尝试在子例程中使用以下代码创建 $ 或 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 shell 中,我的数据如下:

> 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 回答