簡體   English   中英

MongoDB - 更新數組的子文檔以包含計算值

[英]MongoDB - Update the array's sub-document to include the calculated value

基本上,我想從輸入文檔的數組字段中的每個子對象中減去兩個字段,然后更新文檔以包含計算值。

例如,

{   
    "title" : "The Hobbit",

    "rating_average" : "???",
    "ratings" : [
        {
            "title" : "best book ever",
            "start" : 5,
            "finish" : 7
        },
        {
            "title" : "good book",
            "start" : 4,
            "finish" : 8
        }
    ]
}

我想減去每個對象的完成開始,然后將新計算的字段保存到我現有的文檔中。

所以在更新我的文件后,它應該是這樣的:

{   
    "title" : "The Hobbit",
    "rating_average" : "???",
    "ratings" : [
        {
            "title" : "best book ever",
            "start" : 5,
            "finish" : 7
             “diff”:2
        },
        {
            "title" : "good book",
            "start" : 4,
            "finish" : 8
             “diff”:4

        }
    ]
}

那么,我該怎么做呢?

提前致謝。

這是支持聚合管道階段$set 的4.2 版更新方法。 $map投影運算符用於導出每個數組元素的diff字段:

db.test.updateOne(
   {  },
   [
       {
         $set: {
             ratings: {
                 $map: {
                     input: "$ratings",
                        as: "rating",
                        in: {
                             $mergeObjects: [
                                 "$$rating",
                                 { "diff" : { $subtract: [ "$$rating.finish", "$$rating.start" ] } }
                             ]
                        }
                  }
              }
          }
      }
  ]
)

以下聚合管道將在數組中創建一個具有 diff 字段的新集合。

db.books.aggregate([
    {
        $unwind: "$ratings"
    },
    {
        $addFields: {
            "ratings.diff": {
                $subtract: ["$ratings.finish", "$ratings.start"]
            }
        }
    },
    {
        $group: {
            _id: "$_id",
            title: {
                $first: "$title"
            },
            rating_average: {
                $first: "$rating_average"
            },
            ratings: {
                $addToSet: "$ratings"
            }
        }
    },
    {
        $out: "modified-books"
    }
])

您甚至可以通過在最后階段指定$out: "books"來替換現有的集合。

這不是完成此任務的理想方式,但我認為沒有其他選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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