我有这样的文档:
{
"_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
},
},
]
}
我喜欢获取其 id == 133333(在 [1] 中)的 session 元素 并能够用新值更新它并向它添加新元素 所以它看起来像这样:
{
id : 133333,
"setOID" : {
"Number" : 3333
},
"custID" : {
"Number" : 4444
},
new_attr_1 : 0
new_attr_2 : 2
},
C Driver的文档很难看懂 有人可以展示最好的方法吗?
更新
我尝试使用 cdriver 版本 1.4(最新)并且发生了奇怪的事情
更新失败(returend true)
但是文档中没有更新
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;
}
当您看到发生了很多奇怪的事情时,我如何检查更新是否真的成功了?
最佳答案
在这里回答你的问题是一个解决方案:
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 );
}
关于MongoDB CDriver 如何更新索引 N 中的数组对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38097500/