您可以在单个原子更新操作中执行此操作。假设您的收藏有以下文档:
蒙古壳
db.test.insert([
{
"_id": 1,
"items": [
{ "id": 1, "date": new Date("2016-05-20") },
{ "id": 2, "date": new Date("2016-05-21") }
]
},
{
"_id": 2,
"items": [
{ "date": new Date("2016-05-22") }
]
}
])
然后 mongo shell 中的以下更新语句将通过将新的子文档 { "id": 3, "date": new Date() } 添加到 items 数组来更新具有 items 子文档但没有 id 键的文档:
db.test.update(
{ "items.id": { "$exists": false } },
{
"$push": {
"items": { "id": 3, "date": new Date() }
}
}
)
查询测试集合
> db.test.find().pretty()
{
"_id" : 1,
"items" : [
{
"id" : 1,
"date" : ISODate("2016-05-20T00:00:00Z")
},
{
"id" : 2,
"date" : ISODate("2016-05-21T00:00:00Z")
}
]
}
{
"_id" : 2,
"items" : [
{
"date" : ISODate("2016-05-22T00:00:00Z")
},
{
"id" : 3,
"date" : ISODate("2016-05-23T09:33:15.913Z")
}
]
}
仅当没有其他子文档具有匹配的 id 时才添加新的子文档,您只需要一个更新操作即可指定匹配条件
在更新查询文档中。
下面的更新操作会将带有id = 4 的子文档添加到数组中,因为现有文档中没有匹配的数组元素:
db.test.update(
{ "items.id": { "$ne": 4 } },
{
"$push": {
"items": { "id": 4, "date": new Date() }
}
}
)
对于您只想添加子文档的独占更新,如果存在 id 字段并且给定的 id 不匹配,则将条件与相等检查一起包含:
db.test.update(
{
"items.id": {
"$exists": true,
"$ne": 4
}
},
{
"$push": {
"items": { "id": 4, "date": new Date() }
}
}
)