2012-10-16 68 views
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); 

,但我得到NULL從mongo_find我返回光標()。我試圖轉儲連接mongo-> errstr和mongo-> err代碼,它們都是空的且爲0.

如果我取出bson_append_start/finish_array(),基本上將它更改爲$和query, 。 (不幸的是$,是不是我所試圖做...)

我將不勝感激,如果有人可以告訴我,我應該如何通過C驅動器構建合適的複合查詢BSON。

從蒙戈外殼,我的數據是存在如下:

> 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

好吧,經過多次實驗並查看源代碼後,我發現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); 
相關問題