如何使用一个字段值更新猫鼬中的另一个字段?

时间:2020-04-09 03:45:26

标签: node.js mongodb mongoose

我有以下文件:

{
    "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中的一个字段?

1 个答案:

答案 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"] },
    },
  }]
)

请参阅:Updates with Aggregation Pipeline