如果外部数组中的id不匹配,则推入外部数组;如果外部数组中的id匹配,则推入内部数组

时间:2018-02-01 14:37:57

标签: node.js mongodb

我有这样的模特

     {
     "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":[  

               ],

            }
         ],

      }

否则,如果给出除了123之外的array1的_id,即不存在,即657

结果sholud是

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

               ],

            },

         ],

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

               ],

            }
         ],

      }

结果应该是

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分: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":[]}}}}
  )
}

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