MongoDB在数组内部向上插入

Sau*_*wal 6 javascript mongodb node.js mongodb-query

我试图在mongoDB数组中插入,更新,删除值。我的mongoDB版本是3.4.23

这是我的收藏:

{
  "link": "abc.com",
  "Values": [{
      "valueID": "v1",
      "date": "05-07-2015",
      "value": "10"
  }]
}
Run Code Online (Sandbox Code Playgroud)

我试图做一些UPSERT类型的查询插入/更新的Values阵列数据,但没能如愿。我有解决方案,但对我不起作用。

可以说我有 "valueID": "v1"

{
    "valueID": "v1",
    "date": "05-07-2015",
    "value": "20"
}
Run Code Online (Sandbox Code Playgroud)

因此,在这种情况下,我想"value": "20"在上述集合中进行设置,因此输出应为:

{
  "link": "abc.com",
  "Values": [{
      "valueID": "v1",
      "date": "05-07-2015",
      "value": "20"//updated value
  }]
}
Run Code Online (Sandbox Code Playgroud)

如果我通过了,"valueID": "v2"它应该将新值插入到集合中,如下所示:

{
  "link": "abc.com",
  "Values": [{
      "valueID": "v1",
      "date": "05-07-2015",
      "value": "10"
  },
  {
    "valueID": "v2",
    "date": "xyz",
    "value": "xyz"
  }]
}
Run Code Online (Sandbox Code Playgroud)

非常感谢您的帮助。

Ash*_*shh 3

蒙古数据库4.2

使用聚合管道进行更新

从 MongoDB 4.2开始,db.collection.update()方法可以接受指定要执行的修改的聚合管道[ stage1, stage2, ... ] 。

所以这里$reduce使用一些$condition 的操作符就可以解决这个问题。

db.getCollection("ashish2").update(
  //filter criteria for the update operation
  { },
  [{ "$set": {
    "Values": {
      "$reduce": {
        "input": "$Values",
        "initialValue": [],
        "in": {
          "$concatArrays": [
            "$$value",
            {
              "$cond": [
                // Here you can select your value with which you want to match
                { "$eq": ["$$this.valueID", "v2"] },
                // Updation after match
                [{ "valueID": "v1", "date": "05-07-2015", "value": "20" }], 
                // Updation when doesn't match
                {
                  "$concatArrays": [
                    [{ "valueID": "v1", "date": "05-07-2015", "value": "20" }],
                    ["$$this"]
                  ]
                }
              ]
            }
          ]
        }
      }
    }
  }}]
)
Run Code Online (Sandbox Code Playgroud)

注意:对于私有版本,您必须使用两个查询,或者您可以查看此答案Can youspecify a key for $addToSet in Mongo?