У меня есть документ, подобный следующему:
{
"_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 вместе с оператором Positional $ для обновления массива вложенных объектов в mongoDB, используя mon goose
Я использую mongoDB версии 4.2.2