2016-06-29 32 views
2

我有文件,看起來像這樣:MongoDB CDriver如何更新索引N中的數組對象?

{ 
    "_id" : ObjectId("5768e43"), 
    "APPID" : { 
     "Number" : 0, 
    }, 
    sessions : [{ 
      id : 111111, 
      "setOID" : { 
       "Number" : 0 
      }, 
      "custID" : { 
       "Number" : 0 
      }, 

     }, { 
      id : 133333, 
      "setOID" : { 
       "Number" : 2 
      }, 
      "custID" : { 
       "Number" : 2 
      }, 
     }, { 
      id : 7777, 
      "setOID" : { 
       "Number" : 2 
      }, 
      "custID" : { 
       "Number" : 2 
      }, 

     }, 
    ] 
} 

我喜歡讓會議elment其其ID == 133333(這是在[1]) 並能夠用新值更新它並添加新的元素,它 所以它看起來就像這樣:

{ 
    id : 133333, 
    "setOID" : { 
     "Number" : 3333 

    }, 
    "custID" : { 
     "Number" : 4444 

    }, 
    new_attr_1 : 0 
    new_attr_2 : 2 
}, 

的文檔是很難理解,當涉及到C驅動 有人可以展示一下它的最好辦法做到這一點?

UPDATE
我試着用cdriver 1.4版本(最新)和奇怪的事情正在發生 更新並失敗(returend真) 但在文件中沒有更新

bson_t *query2 = BCON_NEW ("sessions.id ", BCON_INT32 (133333));  
bson_t *update; 

update = BCON_NEW ("$set", "{","Sessions.$.new_attr_1" ,BCON_INT32 (0) ,"}"); 

if (!mongoc_collection_update (collection,MONGOC_UPDATE_NONE, query2, update, NULL, &error)) { 
    fprintf (stderr, "%s\n", error.message); 
    goto fail; 
} 

,從而你會看到奇怪的事情發生,我如何檢查更新是否真的成功?

回答

1

要在這裏回答你的問題是一個解決方案:

db.doc.update({"sessions.id":133333}, 
       {$set: {"sessions.$.setOID.Number":3333, 
         "sessions.$.custID.Number":4444, 
         "sessions.$.new_attr_1" : 0, 
         "sessions.$.new_attr_2" : 2 
        } 
       }) 

並與C驅動器應該是類似的東西:

static void updateSession(mongo_connection *conn) { 
    bson cond[1], op[1]; 

    bson_init(cond); 
    bson_append_int(cond, "sessions.id",133333); 
    bson_finish(cond); 

    bson_init(op); 
    bson_append_start_object(op, "$set"); 
     bson_append_int(op, "sessions.$.setOID.Number",3333); 
     bson_append_int(op, "sessions.$.custID.Number",4444); 
     bson_append_int(op, "sessions.$.new_attr_1",0); 
     bson_append_int(op, "sessions.$.new_attr_2",2); 
    bson_append_finish_object(op); 
    bson_finish(op); 

    mongo_update(conn, "db.doc", cond, op, MONGO_UPDATE_BASIC); 

    bson_destroy(cond); 
    bson_destroy(op); 
} 
+0

謝謝,但我需要的C驅動方式的人,在C驅動是噩夢 – user63898

+0

什麼是「$」美元符號?我將其轉換爲BCON_NEW – user63898

+0

在這裏,您有一個使用C驅動程序更新文檔的示例http://api.mongodb.com/c/0.4/tutorial.html –