[英]mongodb aggregation "$in" operator: how can i address the path to all nested array elements inside an array
[英]Can't use aggregation operator $add to update dates while using Array Filters (MongoDB)
下面是下面 User 集合中的文檔示例。
{
"_id" : 1,
"username" : bob,
"pause" : true,
"pause_date" : ISODate("2021-07-16T07:13:48.680Z"),
"learnt_item" : [
{
"memorized" : false,
"character" : "一",
"next_review" : ISODate("2021-07-20T11:02:44.979Z")
},
{
"memorized" : false,
"character" : "二",
"next_review" : ISODate("2021-07-20T11:02:44.979Z")
},
...
]
}
如果“記憶”字段為假,我需要更新“learnt_item”中的所有嵌套文檔。
更新內容是:
我能夠使用 findOneAndUpdate 和 arrayFilters 實現 1 和 2,並且還通過使用當前日期更新“next_review”字段以確保它正確更新來測試 3。
User.findOneAndUpdate({"_id": req.user._id},
{$set:{"learnt_item.$[elem].next_review": DateTime.local(),"pause_date": null, "pause": value }},
{new:true, arrayFilters: [{"elem.memorized": false}]}).exec((err, doc) =>{if (err){res.send(err)} else {res.send(doc)}});
我正在考慮使用 $add 聚合運算符來增加日期基數
"learnt_item.$[elem].next_review": {$add: ["$learnt_item.$[elem].next_review","$pause_date"]}
但是,根據文檔,arrayFilters 不適用於使用聚合管道的更新。
是否有另一種更有效的方法可以更新 ISOdate?
如果您運行的是 MongoDB 4.2 或更高版本,您可以使用管道作為更新函數的第二個參數,這樣您就可以使用運算符$map
和$cond
來查找memorized
的屬性等於false
的條目,然后添加 4到next_review
日期的天數(以毫秒為單位):
db.collection.update({
"_id": 1
},
[
{
$set: {
"pause_date": null,
"pause": false,
"learnt_item": {
$map: {
input: "$learnt_item",
as: "item",
in: {
$cond: [
{
$eq: [
"$$item.memorized",
false
]
},
{
memorized: "$$item.memorized",
character: "$$item.character",
next_review: {
$add: [
"$$item.next_review",
345600000
]
}
},
"$$item"
]
}
}
},
}
}
],
{
new: true,
});
您可以在此處查看正在運行的示例: https : //mongoplayground.net/p/oHh1JWiP8vs
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.