MongoDB C++;更新数组中的元素 我对MangGDB和C++很陌生。 我的问题:我想更新数据库集合中的JSON文档: { "_id" : ObjectId("5ac4beacc0e2a512e6377d43"), "docID" : "SL/UO4ZJgdUxcRLKxXDWMg==", "docVersion" : "DA3EF8047AD0F[…]77C6F9286488CEE6a", "userID" : "bob@nds-local", "parts" : [ { "partID" : "u2v[…]0KG7R", "partVersion" : "", "partKey" : "", "docPosition" : 0, "counter" : 0, "users" : { "everyone" : [ 1, 0, 0, 0, 0, 0, 0, 0, 0 ] } }, { "partID" : "AZ3[…]1Odeku", "partVersion" : "", "partKey" : "", "docPosition" : 0, "counter" : 0, "users" : { } } ] }
首先,我想从我的数据库中获取此文档。因此,我使用以下小代码:MongoDB C++;更新数组中的元素 我对MangGDB和C++很陌生。 我的问题:我想更新数据库集合中的JSON文档: { "_id" : ObjectId("5ac4beacc0e2a512e6377d43"), "docID" : "SL/UO4ZJgdUxcRLKxXDWMg==", "docVersion" : "DA3EF8047AD0F[…]77C6F9286488CEE6a", "userID" : "bob@nds-local", "parts" : [ { "partID" : "u2v[…]0KG7R", "partVersion" : "", "partKey" : "", "docPosition" : 0, "counter" : 0, "users" : { "everyone" : [ 1, 0, 0, 0, 0, 0, 0, 0, 0 ] } }, { "partID" : "AZ3[…]1Odeku", "partVersion" : "", "partKey" : "", "docPosition" : 0, "counter" : 0, "users" : { } } ] },c++,mongodb,mongodb-query,mongo-cxx-driver,C++,Mongodb,Mongodb Query,Mongo Cxx Driver,首先,我想从我的数据库中获取此文档。因此,我使用以下小代码: bsoncxx::stdx::optional<bsoncxx::document::value> resultDocument = collection.find_one(document{} << "docID" << docID << finalize); bsoncxx::stdx::可选结果文档= collection.find_one(documen
bsoncxx::stdx::optional<bsoncxx::document::value> resultDocument =
collection.find_one(document{} << "docID" << docID << finalize);
bsoncxx::stdx::可选结果文档=
collection.find_one(document{}不需要从数据库检索文档,您可以一次性更新文档
您还需要使用:parts.partID
在查询中添加partID
字段,以查找数组中的匹配项
要更新您请求的字段(1)并在用户中添加新键(2),您需要使用,因为它将允许访问与查询匹配的元素
它看起来是这样的:
db[“docs”]更新一次(
制作文档(
kvp(“文档ID”,文档ID),
kvp(“parts.partID”,partID)
),
制作文档(
kvp(“$set”),生成文档(
kvp(“零件$.partKey”,新零件键),
kvp(“parts.$.partVersion”,新partVersion),
kvp(“零件$.docPosition”,新docPosition),
kvp(“parts.$.users.”+新用户,make_数组(1,2,3,4,5))
)
)
)
);
kvp(“parts.$.users.”+newUser,make_数组(1,2,3,4,5))
将在users
内部创建一个键,该键的值为newUser
变量,它将包含数组[1,2,3,4,5]
可以使用$unset
操作符以类似的方式删除用户(2):
db[“docs”]更新一次(
制作文档(
kvp(“文档ID”,文档ID),
kvp(“parts.partID”,partID)
),
制作文档(
kvp(“$unset”,make_文档(kvp(“parts.$.users.”+userToDelete,”))
)
);
如何操作一个特定用户(2)的数组将取决于您计划更新它的内容/方式,但为此,您可以使用
以下代码段:
首先,它更新partKey
,partVersion
和
docPosition
字段,并在
partID:“AZ3[…]1Odeku”
part
第二,它删除先前添加的用户
请注意,我已将您文档数据中的三个点替换为省略号。
。
,因为这导致mongocxx驱动程序即使在查询中也使用省略号,也无法找到任何匹配项(在mongo shell中工作正常)
#包括
#包括
#包括
#包括
#包括
使用bsoncxx::builder::basic::kvp;
使用bsoncxx::builder::basic::make\u数组;
使用bsoncxx::builder::basic::make\u文档;
void updatePartAndAddNewUser(const mongocxx::客户端和客户端,
常量标准::字符串和文档ID,
const std::string和partID,
const std::string和newPartKey,
const std::string和newPartVersion,
内特纽多克酒店,
const std::string和newUser)
{
mongocxx::数据库db=client[“stack”];
db[“文档”]。更新一个(
制作文档(
kvp(“文档ID”,文档ID),
kvp(“parts.partID”,partID)
),
制作文档(
kvp(“$set”),生成文档(
kvp(“零件$.partKey”,新零件键),
kvp(“parts.$.partVersion”,新partVersion),
kvp(“零件$.docPosition”,新docPosition),
kvp(“parts.$.users.”+新用户,make_数组(1,2,3,4,5))
)
)
)
);
}
void removeUserFromPart(const mongocxx::客户端和客户端,
常量标准::字符串和文档ID,
const std::string和partID,
常量std::string和userToDelete)
{
mongocxx::数据库db=client[“stack”];
db[“文档”]。更新一个(
制作文档(
kvp(“文档ID”,文档ID),
kvp(“parts.partID”,partID)
),
制作文档(
kvp(“$unset”,make_文档(kvp(“parts.$.users.”+userToDelete,”))
)
);
}
int main(int,char**)
{
标准::cout
collection.update_one(document{} << "docID" << docID
<< "docVersion" << docVersion
<< finalize,
document{} << "$set" << open_document <<
"userID" << "oscar@nds-local" << close_document << finalize);
{
"_id" : ObjectId("5ac4beacc0e2a512e6377d43"),
"docID" : "SL/UO4ZJgdUxcRLKxXDWMg==",
"docVersion" : "DA3EF8047AD0F[...]77C6F9286488CEE6a",
"userID" : "bob@nds-local",
"parts" : [
{
"partID" : "u2v[...]0KG7R",
"partVersion" : "",
"partKey" : "",
"docPosition" : 0,
"counter" : 0,
"users" : {
"everyone" : [1,0,0,0,0,0,0,0,0]
}
},
{
"partID" : "AZ3[...]1Odeku",
"partVersion" : "newPartVersion1",
"partKey" : "newPartKey",
"docPosition" : 1,
"counter" : 0,
"users" : {
"nobody" : [1,2,3,4,5]
}
}
]
}