我正在尝试使用以下代码在子例程中创建$或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->错误的代码,它们都是空的和0。
如果我取出bson_append_start / finish_array(),基本上将它改为$和查询,它就可以了。 (不幸的是$并不是我想做的......)
如果有人能告诉我如何通过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 }
感谢。
答案 0 :(得分: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分别显示它是'数组'类型和'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);