我有一个带有“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它将不再起作用。
答案 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})