MongoDB CDriver如何更新索引N中的数组对象?
MongoDB CDriver how to update array object in index 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
},
},
]
}
我喜欢获取其 id == 133333(在 [1] 中)的会话元素
并能够用新值更新它并向它添加新元素
所以它看起来像这样:
{
id : 133333,
"setOID" : {
"Number" : 3333
},
"custID" : {
"Number" : 4444
},
new_attr_1 : 0
new_attr_2 : 2
},
关于C驱动的文档很难理解
谁能告诉我最好的方法是什么?
更新
我尝试使用 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 );
}
我有这样的文档:
{
"_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] 中)的会话元素 并能够用新值更新它并向它添加新元素 所以它看起来像这样:
{
id : 133333,
"setOID" : {
"Number" : 3333
},
"custID" : {
"Number" : 4444
},
new_attr_1 : 0
new_attr_2 : 2
},
关于C驱动的文档很难理解 谁能告诉我最好的方法是什么?
更新
我尝试使用 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 );
}