我将子文档推送到数组中。 基本上,subdocs是这样的:
{
id:"someId",
date:Date
}
我想添加新的subdoc只有在没有其他带有匹配id.I的文件时才会在mongodb文档中找到$addToSet
修饰符但是我不确定它是否只能检查子文档中的键而不是comparin整个数组项目到另一个。
有没有办法在单个查询中执行此操作,或者无论如何我应该使用2个查询?
答案 0 :(得分:1)
您可以在单个原子更新操作中执行此操作。假设您的收藏集包含以下文件:
Mongo shell
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中的以下更新语句将通过向{{{{}}添加新的子文档items
来更新具有id
子文件但没有{ "id": 3, "date": new Date() }
密钥的文档。 1}}数组:
items
查询测试集合
db.test.update(
{ "items.id": { "$exists": false } },
{
"$push": {
"items": { "id": 3, "date": new Date() }
}
}
)
要仅在没有其他具有匹配id的子网时添加新的子网,您只需要一个更新操作,您可以在其中指定匹配条件 在更新查询文档中。
以下更新操作将向数组添加一个带有> 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 = 4
对于只想添加子文档的独占更新,如果存在id字段并且给定的id不匹配,则将条件与相等性检查一起包括:
db.test.update(
{ "items.id": { "$ne": 4 } },
{
"$push": {
"items": { "id": 4, "date": new Date() }
}
}
)