我有以下文件:
{
"logout_time": null,
"duration": null,
"_id": "5e8e8dd2b0c2a30ad12973f9",
"user_id": "5e8109ea5bc5822aa531a57d",
"comp_id": "5e8d16a0c1834fd3d8e9e1eb",
"org_id": "5e8c7a34c358958a58be4755",
"login_time": "2020-03-16T05:29:34.000Z",
"server_time": "2020-04-09T02:52:02.646Z",
"__v": 0
}
我正在使用猫鼬和nodeJS。现在,当我得到注销时间时,可以使用以下功能在文档中对其进行更新:
async function logOut(user_id, comp_id, time) {
try {
let updateObj = await Session.updateMany(
{ user_id: user_id, comp_id: comp_id, logout_time: null },
{
$set: {
logout_time: time,
},
}
);
return {
status: "success",
msg: "Logged Out successfully",
update_info: updateObj,
};
} catch (err) {
return { status: "failed", message: err.message };
}
}
但是现在我想更新持续时间作为注销时间-当我获得注销时间时的登录时间,我尝试了很多事情,但是无法使用猫鼬完成它。 我是mongo的新手,并且使用过MySQL。
我尝试了以下操作,但不起作用:
async function logOut(user_id, comp_id, time) {
try {
let updateObj = await Session.updateMany(
{ user_id: user_id, comp_id: comp_id, logout_time: null },
{
$set: {
logout_time: time,
duration: { $subtract: [Date(time), "$login_time"] },
},
}
);
return {
status: "success",
msg: "Logged Out successfully",
update_info: updateObj,
};
} catch (err) {
return { status: "failed", message: err.message };
}
}
所以我的问题是我们如何使用其他字段的值更新mongoDB中的一个字段?
答案 0 :(得分:2)
因为$subtract是聚合管道运算符,所以您需要在聚合中使用它。幸运的是,从MongoDB 4.2开始,您可以使用聚合管道进行更新操作。由于您使用的是mongoDB 4.2.2版,因此以下内容应适用:
Session.updateMany(
{ user_id: user_id, comp_id: comp_id, logout_time: null },
[{
$set: {
logout_time: new Date(time),
duration: { $subtract: [new Date(time), "$login_time"] },
},
}]
)