我试图更新数组中的一个字段,但是如果这个字段不存在,使用$set会添加它,如何避免呢?这是我的模型:
[
{
"config": {
"isEnabled": false,
"test": {
"sub": [
{
"sub": [
{},
{},
{},
{},
{
"k": "l"
}
]
},
{
"sub": [
{},
{},
{},
{},
{
"k": "l"
}
]
},
{
"sub": [
{},
{},
{},
{}
]
}
]
}
}
},
]
下面是我正在运行的查询
db.collection.update({
"config.isEnabled": false
},
{
"$set": {
"config.test.sub.$[].sub.4": {
"b": "l"
}
}
})
输出:
[
{
"_id": ObjectId("5a934e000102030405000000"),
"config": {
"isEnabled": false,
"test": {
"sub": [
{
"sub": [
{},
{},
{},
{},
{
"b": "l"
}
]
},
{
"sub": [
{},
{},
{},
{},
{
"b": "l"
}
]
},
{
"sub": [
{},
{},
{},
{},
{
"b": "l"
}
]
}
]
}
}
}
]
但我想达到这样的结果:
[
{
"_id": ObjectId("5a934e000102030405000000"),
"config": {
"isEnabled": false,
"test": {
"sub": [
{
"sub": [
{},
{},
{},
{},
{
"b": "l"
}
]
},
{
"sub": [
{},
{},
{},
{},
{
"b": "l"
}
]
},
{
"sub": [
{},
{},
{},
{},
{
"b": "l"
}
]
}
]
}
}
}
]
如果您观察到模型数组中第三个元素的最后一个元素,它不包含k=l,因此我不想在数组的最后一个元素中设置该字段
也就是说,在模型中,这是一个元素:
{
"sub": [
{},
{},
{},
{}
]
}
当我运行查询时,它会将该元素更新为:
{
"sub": [
{},
{},
{},
{},
{
"b": "l"
}
]
}
但我不希望它更新该元素
MongoPlayground链接:Mongo Playground For The Above Example
如果这能在 Mongoose 身上实现,那也行
谢谢你的时间,我很感激任何帮助
我尝试使用addToSet和setOnInsert,但都不起作用,我知道我可以找到文档,然后手动添加一些逻辑来适当地更新字段,然后更新文档,但我想知道是否有一种方法可以通过mongo查询实现
1条答案
按热度按时间8qgya5xd1#
一个选项是使用
$[<identifier>]
:了解它在playground example上的工作原理