[英]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.