Mongodb 测试中条件推送到数组

Geo*_*vva 4 mongodb

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

{
   "id": 2,
   "messages": [
      {
         "id": 1,
         "text": "foo"
      },
      {
         "id": 2,
         "text": "bar"
      }
   ]
}
Run Code Online (Sandbox Code Playgroud)

我想更新文档:仅当“消息”不包含具有此类 id 的文档时,才将新的“消息”文档添加到“消息”字段。例如:

{
  "id": 2,
  "text": "bllllllll"
}
Run Code Online (Sandbox Code Playgroud)

不应该添加

{
  "id": 3,
  "text": "foo"
}
Run Code Online (Sandbox Code Playgroud)

应该添加

我怎样才能进行条件附加?我知道我可以通过 $elemMatch 运算符过滤 Find 部分中的文档,但它仅适用于 Update,而使用 Upsert 则不再适用。

Vai*_*til 5

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

  var data = {
      "id": 3.0,
      "text": "bllllllll"
    }
Run Code Online (Sandbox Code Playgroud)

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

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

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