【问题标题】:Push into outer array if id in outer array doesnot match or push into inner array if id in outer array match如果外部数组中的 id 不匹配,则推入外部数组;如果外部数组中的 id 匹配,则推入内部数组
【发布时间】:2018-02-01 14:37:56
【问题描述】:

我有这样的模型

     {
     "array1": [
                {
                    "_id": "123",
                    "array2": [
                          {
                              "_id": "123",
                              "answeredBy": [],
                          }

                     ],
                 }
             ] 
}

如果我在array1中有id,将文档推入array2或在array1中创建新文档。

例如:

如果我给有新对象

{
   "_id": "456",
   "answeredBy": [],
} 

如果给定array1的_id为123

结果应该是

      {  
   "array1":[  
      {  
         "_id":"123",
         "array2":[  
            {  
               "_id":"123",
               "answeredBy":[  

               ],

            },
            {  
               "_id":"456",
               "answeredBy":[  

               ],

            }
         ],

      }

否则,如果将 array1 的 _id 指定为 123 以外的值,即不存在,即 657

结果应该是

{  
   "array1":[  
      {  
         "_id":"123",
         "array2":[  
            {  
               "_id":"123",
               "answeredBy":[  

               ],

            },

         ],

      }      {  
         "_id":"657",
         "array2":[  
            {  
               "_id":"456",
               "answeredBy":[  

               ],

            }
         ],

      }

结果应该是

我怎样才能做到这一点?

【问题讨论】:

    标签: node.js mongodb


    【解决方案1】:

    您的问题是similar,除非您同时推送两个更新。

    不可能以原子方式执行您的请求,因此您需要为每个请求执行两个更新查询。

    当找到匹配的外部记录时更新,通过将新元素推送到内部数组中导致更新。

    db.col.update(
        {"array1._id": "123"},
        {"$push":{"array1.$.array2":{"_id":"456","answeredBy":[]}}}
    )
    

    当外部记录不匹配时更新,你将得到修改计数 0。

    db.col.update(
        {"array1._id": "657"},
        {"$push":{"array1.$.array2":{"_id":"456","answeredBy":[]}}}
    )
    
    if(nModified == 0) {
      db.col.update(
        {},
        {"$push":{"array1":{ "_id":"657","array2":[{"_id":"456","answeredBy":[]}}}}
      )
    }
    

    您可以阅读链接的答案以获取更多详细信息。

    【讨论】:

    • 不能在单个查询中完成吗?
    • 不,您不能用于嵌套数组。 upsert 在文档级别工作
    • 谢谢。我试图在单个查询中进行,这可能会减少我的应用程序中的一个数据库命中。
    猜你喜欢
    • 1970-01-01
    • 2021-11-28
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    • 2021-04-29
    相关资源
    最近更新 更多