MongoDB - findOneAndUpdate() 在单个字段上使用 $set 和 $cond 更新
我试图将数据库中的字段 (statusObject.machineA.status) 更新为“工作”(仅当其值为“等待”时)。我尝试了以下操作:
Project.findOneAndUpdate({
$or: [
{"statusObject.machineA.status":"waiting"},
{"statusObject.machineB.status":"waiting"}
]
}, [{
$set: {
"statusObject.machineA.status": {
$cond: [
{ $eq: ["$statusObject.machineA.status", "waiting"] },
"working",
"waiting"
]
}
}
}], {
new: true
}, function(err, document) {});
我的数据库如下所示:
var statusObject = {
machineA:{
status: 'waiting',
buildProgress: 0
},
machineB:{
status: 'waiting',
buildProgress: 0
}
};
例如,我希望下面的 JSON:
statusObject: {
machineA:{
status: 'waiting',
buildProgress: 0
},
machineB:{
status: 'waiting',
buildProgress: 0
}
}
执行查询后如下所示:
statusObject:{
machineA:{
status: 'working',
buildProgress: 0
},
machineB:{
status: 'waiting',
buildProgress: 0
}
}
OR (Not Both)
statusObject:{
machineA:{
status: 'waiting',
buildProgress: 0
},
machineB:{
status: 'working',
buildProgress: 0
}
}
但经过一些测试,我意识到 $cond 对象不接受中使用的字段$set 即 statusObject.machineA.status。也就是说,当我根据一个字段的值更新一个字段时,它可以工作,但如果我根据一个字段本身的值更新一个字段,它就不起作用。没有显示错误,但查询只是不更新字段。
嵌套对象是否存在语法错误,或者只是不支持? 任何替代方法将不胜感激。谢谢!
I am trying to update a field (statusObject.machineA.status) to 'working' in a database only if its value is 'waiting'. I have tried the following:
Project.findOneAndUpdate({
$or: [
{"statusObject.machineA.status":"waiting"},
{"statusObject.machineB.status":"waiting"}
]
}, [{
$set: {
"statusObject.machineA.status": {
$cond: [
{ $eq: ["$statusObject.machineA.status", "waiting"] },
"working",
"waiting"
]
}
}
}], {
new: true
}, function(err, document) {});
My database looks like this:
var statusObject = {
machineA:{
status: 'waiting',
buildProgress: 0
},
machineB:{
status: 'waiting',
buildProgress: 0
}
};
For Example, I want the below JSON:
statusObject: {
machineA:{
status: 'waiting',
buildProgress: 0
},
machineB:{
status: 'waiting',
buildProgress: 0
}
}
to look like below after executing the query:
statusObject:{
machineA:{
status: 'working',
buildProgress: 0
},
machineB:{
status: 'waiting',
buildProgress: 0
}
}
OR (Not Both)
statusObject:{
machineA:{
status: 'waiting',
buildProgress: 0
},
machineB:{
status: 'working',
buildProgress: 0
}
}
But after a little testing, I realized that the $cond object does not accept the field used in the $set i.e statusObject.machineA.status. That is, when I update one field based on another field's value, it works, but it doesn't work if I update a field based on its own value. No errors are shown, but the query just doesn't update the field.
Is there something wrong syntax-wise for the nested object or is it just not supported?
Any alternative method/s will be appreciated. Thanks!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
事实证明,mongoose 5.xxx 不支持聚合管道。我只需将 Mongoose 更新到最新版本即可使其正常工作:
谢谢@Takis _
Turns out, aggregation pipelines are not supported for mongoose 5.xxx. I got it working by just updating my Mongoose to the latest one:
Thanks @Takis _