node.js - 我们如何在更新中使用 $subtract 聚合管道运算符和位置 $ 运算符?
问题描述
我有如下文件:
{
"_id": "5e8ecce4cf2647202dfd4551",
"logout_time": null,
"apps": [{
"name": "notepad",
"open_time": "1584351875000",
"close_time": null,
"duration": null,
"tasks": []
}],
"duration": null,
"user_id": "5e8109ea5bc5822aa531a57d",
"comp_id": "5e8d16a0c1834fd3d8e9e1eb",
"org_id": "5e8c7a34c358958a58be4755",
}
所以现在当我接近时间时,我使用以下函数在 apps.close_time 中更新它:
async function closeApp(app_name, session_id, time) {
try {
let updateObj = await Session.updateMany(
{ _id: session_id, "apps.name": app_name, "apps.close_time": null },
{
$set: {
"apps.$[].close_time": new Date(time),
},
}
);
return {
status: "success",
msg: "App Added successfully",
update_info: updateObj,
};
} catch (err) {
return { status: "failed", message: err.message };
}
}
但现在我也想将持续时间更新为close_time-open_time
. 我知道它可以使用 $subtract 聚合管道来实现,它对我来说适用于非嵌套对象。我尝试了以下不起作用的代码:
async function closeApp(app_name, session_id, time) {
try {
let updateObj = await Session.updateMany(
{ _id: session_id, "apps.name": app_name, "apps.close_time": null },
[
{
$set: {
"apps.$.close_time": new Date(time),
"apps.$.duration": {
$toInt: {
$divide: [
{ $subtract: [new Date(time), "$apps.$.$open_time"] },
60000,
],
},
},
},
},
]
);
return {
status: "success",
msg: "App Added successfully",
update_info: updateObj,
};
} catch (err) {
return { status: "failed", message: err.message };
}
}
所以我的问题是我们如何使用 $subtract 聚合管道运算符与位置 $ 运算符一起使用 mongoose 更新 mongoDB 中的嵌套对象数组
我正在使用 mongoDB 版本 4.2.2
解决方案
根据评论 - 由于“应用程序”是一个数组,您需要在聚合中使用$map来更新元素中的值。
询问 :
[
{
$addFields: {
apps: {
$map: {
input: "$apps", /** Iterate through 'apps' array & re-create it */
in: {
$cond: [ /** Check for required conditions */
{ $and: [ { $eq: ["$$this.name", app_name] }, { $eq: ["$$this.close_time", null] }] },
{ /** If Yes, merge existing object with new field values */
$mergeObjects: [
"$$this",
{
close_time: new Date(time),
duration: { $toInt: { $divide: [ { $subtract: [new Date(time), "$$this.open_time"] },60000 ]}}
}
]
},
"$$this" /** If No, Return the element of 'apps' to apps array */
]
}
}
}
}
}
];
推荐阅读
- python - Tensorflow 对象检测中的输入张量与 Python 签名不兼容
- node.js - 缓冲到图像节点js
- python - 如何阻止python字典忽略列表中的输入
- ios - 处理具有多个捆绑 ID 的应用内购买
- python - Ipywidgets (Vbox) 没有出现在 Jupyter 笔记本上
- javascript - 使用 vee-validate 在 vue js 中验证时出错
- c# - 如何使 ac# 程序在后台和启动时运行
- amazon-web-services - 如何通过aws API网关从aws lambda中的简单curl post请求中获取文件名
- jquery - jquery Ajax Post成功消息不起作用
- spring-boot - 创建 Stripe 支付后端 API 是否安全?