簡體   English   中英

使用數組過濾器 (MongoDB) 時不能使用聚合運算符 $add 來更新日期

[英]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”中的所有嵌套文檔。

更新內容是:

  1. “暫停日期”為空
  2. “暫停”為假
  3. 根據“pause_date”和當前時間之間經過的持續時間更新“next_review”中的 ISOdate。 例如 pause_date 是 4 小時前,然后我想在“next_review”中添加 4 小時

我能夠使用 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM