Mongo - 如何在不创建“重复”的情况下更新数组?

时间:2016-09-11 10:45:53

标签: arrays mongodb duplicates

我正在尝试用Mongo做点什么,但我被卡住了。我确定答案非常简单,但我找不到。非常感谢你的帮助。

我有一份文件(见下文)我想更新。

{
  _id: ObjectId("57d52d9c56f0dc1c93254265"),
  processus: [
    {
      action: "action 1",
      date: ISODate("2016-08-23T22:00:00Z")
    },
    {
      action: "action 2",
      date: ISODate("2016-12-11T23:00:00Z")
    }
  ]
}

更确切地说,我想“更改操作的日期”1.例如,我想让我的文档像这样:

{
  _id: ObjectId("57d52d9c56f0dc1c93254265"),
  processus: [
    {
      action: "action 1",
      date: "another date"
    },
    {
      action: "action 2",
      date: ISODate("2016-12-11T23:00:00Z")
    }
  ]
}

在我的更新声明下面(使用$ push不起作用/同样的事情)

db.collection('...').update(
     { _id : ObjectId(...) },
     { $addToSet: {
          processus: {
            $each: [ { "action" : "action 1", "date" : "another date" } ],
          }
     }}
)

确实,最终的文件是:

{
  _id: ObjectId("57d52d9c56f0dc1c93254265"),
  processus: [
    {
      action: "action 1",
      date: "another date"
    },
    {
      action: "action 1",
      date: ISODate("2016-08-23T22:00:00Z")
    },
    {
      action: "action 2",
      date: ISODate("2016-12-11T23:00:00Z")
    }
  ]
}

有什么想法吗? 再次感谢。

2 个答案:

答案 0 :(得分:1)

为此,您需要使用带有positional operator $

的$ set
db.collection('...').update(
 { _id : ObjectId("..."),
  "processus.action": "action 1" 
 },
 { $set: { 
    "processus.$.date": "another date"
 }          
})

位置$运算符标识要更新的数组中的元素,而不显式指定数组中元素的位置。位置运算符充当数组中第一个条目的占位符,该条目与发送的过滤器(查询文档)匹配更新命令。

答案 1 :(得分:0)

您可以将$ set用于带有数字数组键的子文档数组:

db.collection.update({ _id: ... }, { $set: { processus.0.date: another_date }})