Arrays 是否只有在满足条件的情况下才有办法将子文档推入mongodb数组?
我正在将子文档推入数组中。 基本上,子文档是这样的:Arrays 是否只有在满足条件的情况下才有办法将子文档推入mongodb数组?,arrays,node.js,mongodb,subdocument,Arrays,Node.js,Mongodb,Subdocument,我正在将子文档推入数组中。 基本上,子文档是这样的: { id:"someId", date:Date } 我只想在没有其他子文档具有匹配id的情况下添加新子文档。我在mongodb文档中找到了$addToSet修饰符,但我不确定它是否可以只检查子文档中的一个键,而不是将整个数组项与另一个进行比较。 是否有任何方法可以在单个查询中执行此操作,或者我应该使用两个查询?您可以在单个原子更新操作中执行此操作。假设您的收藏包含以下文档: Mongo shell db.test.insert([
{
id:"someId",
date:Date
}
我只想在没有其他子文档具有匹配id的情况下添加新子文档。我在mongodb文档中找到了$addToSet
修饰符,但我不确定它是否可以只检查子文档中的一个键,而不是将整个数组项与另一个进行比较。
是否有任何方法可以在单个查询中执行此操作,或者我应该使用两个查询?您可以在单个原子更新操作中执行此操作。假设您的收藏包含以下文档: 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中的以下update语句将通过将新的子文档{“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() }
}
}
)
我说的是只有在没有匹配的情况下才能进入阵列id@nikoss这在这里被认为是一个坏习惯,所以你改变问题的方式;我只想在id不存在时添加新的子文档。与我只想在没有其他子文档具有匹配id时添加新子文档完全不同。上面的答案直接解决了原始问题,我只想在id不存在时添加新子文档。