MongoDB - findOneAndUpdate() 在单个字段上使用 $set 和 $cond 更新

发布于 2025-01-14 10:40:45 字数 1799 浏览 1 评论 0原文

我试图将数据库中的字段 (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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

我们的影子 2025-01-21 10:40:45

事实证明,mongoose 5.xxx 不支持聚合管道。我只需将 Mongoose 更新到最新版本即可使其正常工作:

npm update 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:

npm update mongoose

Thanks @Takis _

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文