有条件地推送到Mongodb中的数组

时间:2017-05-18 09:23:40

标签: mongodb

我有一个带有“messages”数组字段的文档集合:

{
   "id": 2,
   "messages": [
      {
         "id": 1,
         "text": "foo"
      },
      {
         "id": 2,
         "text": "bar"
      }
   ]
}

我想更新文档:仅当“messages”不包含具有此ID的文档时,才会在“messages”字段中添加新的“message”文档。例如:

{
  "id": 2,
  "text": "bllllllll"
}

不应添加

{
  "id": 3,
  "text": "foo"
}

应该添加

如何进行条件追加?我知道我可以通过$ elemMatch运算符过滤查找部分中的文档,但它只适用于Update,使用Upsert它将不再起作用。

2 个答案:

答案 0 :(得分:2)

根据条件将数据推送到数组中,您必须在查询中使用$ ne。

  var data = {
      "id": 3.0,
      "text": "bllllllll"
    }

如果id不在该数组中,则假设您要将数据更新到数组中。

db.getCollection('local').update({
    _id: ObjectId("591d6d2091b1fda9dcb6ef69"),
    "messages.id":{$ne: data.id}
    },{$push:{messages: data}})

$ ne匹配如果data.id存在于数组中则忽略更新,否则将数据推送到数组中。

答案 1 :(得分:1)

为了在某些条件下推送数组中的元素匹配$addToSet是一个好方法。如果条件匹配,它将元素推入数组,确保没有重复此推送,这意味着如果被推送的元素已经存在,它将不会推送它。这有助于upsert:true

db.getCollection('nndemo').update({_id:ObjectId("591d9517faa19dd56df09502")},
{$addToSet:{arr:{a:2}}},{upsert:true})