MongoDB C ++更新数组并添加元素

时间:2018-04-08 08:06:47

标签: c++ mongodb mongodb-query mongo-cxx-driver

我想更新以下JSON文档的" user" -array,该文档保存在MongoDB数据库中(编程语言C ++)

{
        "_id" : ObjectId("5ac4beacc0e2a512e6377d43"),
        "document" : "test",
        "user" : [
            {
                "email" : "a@gmail.com",
                "username" : "Anton Held",
                "job" : "",
            },
            {
                "email" : "b@gmail.com",
                "username" : "Benny Bill",
                "job" : "IT-Officer",
            },
            {
                "email" : "c@gmail.com",
                "username" : "Conny Cenn",
                "job" : "",
            },
        ]
    }

因此我使用此命令来获取此特定文档:

collection.update_one(document{} << "document" << "test"
                                     << finalize,
                      document{} << "$set" << open_document <<
                                 (HOW TO DEAL?!) close_document << finalize);

我知道可以使用&#34; update_one&#34; -method更新文档(或类似的方法,例如&#34; replace_one&#34;,&#34; find_one_and_replace&#34;)。< / p>

但我不知道如何处理这些方法以更新现有用户的用户名&#34; email&#34; -element =&#34; a@gmail.com&# 34;或者我如何将用户添加到现有阵列&#34; user&#34;。

请帮帮我: - )

3 个答案:

答案 0 :(得分:1)

所以你的问题归结为如何将这个mongo命令转换为C ++代码

db.getCollection("testcollection").update(
   {"document":"test", "user.email":"a@gmail.com"},
   {"$set": {"user.$.username":"New Username"}}
)

这是它的样子。注意模式:

  • 成对输出键和值
  • 使用open_documentclose_document进行嵌套{}

示例结果:

collection.update_one(
  document{} << "document" << "test"
             << "user.email" << "a@gmail.com"
             << finalize,
  document{} << "$set"
             << open_document
                 << "user.$.username" << "New Username"
             << close_document << finalize
);

答案 1 :(得分:0)

正如 documentation 所说,您可以执行以下操作来添加新用户:

db.getCollection("testcollection").update(
   { "document": "test"},
   { "$push": {
         "user": {
             "username":"A new user in town ;)",
             "email": "cooluser@gmail.com"
             "job": "A cool job for a cool user"
         }
     }
   }
)

在 mongodbcxx 中:

正如 @rustyx 提到的,您可以简单地将 {} 更改为打开/关闭文档并获得:

collection.update_one(
  document{}
      << "document" << "test"
      << finalize,

  document{}
      << "$push" << open_document
          << "user" << open_document
              << "username" << "A new user in town ;)"
              << "email"    << "cooluser@gmail.com"
              << "job"      << "A cool job for a cool user"
          << close_document
      << close_document
      << finalize
);

顺便说一句,我建议将“user”数组名称替换为“users”,因为它是用户数组而不是用户数组。

答案 2 :(得分:-1)

好的,这可以使用此命令,但我无法将其转换为C ++:

db.getCollection('testcollection').update({"document":"test", "user.email":"a@gmail.com"}, {"$set": {"user.$.username":"New Username"}})

请看一下我上一个例子,我试图找出如何使用email =“a@gmail.com”更新用户的这个特殊元素“username”:

collection.update_one(document{} << "document" << "test" << finalize, 
                      document{} << "$set" << open_document << 
                      (HOW TO DEAL?!) close_document << finalize);