我在 MongoDB 中有以下檔案
{
"product_id": "10001"
"product_name": "Banana"
"product_date": "2022-10-20T00:00:00.000 00:00"
"product_price": 255.15
"dates": {
"2022-10-10": {
"recorded_price": 195.15
},
"2022-10-15": {
"recorded_price": 230.20
},
"2022-10-20": {
"recorded_price": 255.20
}
}
}
我想添加一個名為的新欄位"min_7day_price",它將從過去 7 天的日期物件中選擇最低價格。
像這樣的東西:
{
"product_id": "10001"
"product_name": "Banana"
"product_date": "2022-10-20T00:00:00.000 00:00"
"product_price": 255.15
"dates": {
"2022-10-10": {
"recorded_price": 195.15
},
"2022-10-15": {
"recorded_price": 230.20
},
"2022-10-20": {
"recorded_price": 255.20
}
},
"min_7day_price": 230.20
}
我嘗試使用聚合來創建一個新欄位并將物件轉換為陣列,但我無法過濾其中的值。
{
"min_7day_price": {
$objectToArray: "$dates"
}
}
uj5u.com熱心網友回復:
一種選擇是將更新與管道一起使用:
- 將字典轉換為陣列
- 用于
$reduce僅保留一項,通過迭代和比較當前項:$$this與迄今為止最好的項:$$value - 格式化答案
db.collection.update({},
[
{$set: {datesArr: {$objectToArray: "$dates"}}},
{$set: {
datesArr: {
$reduce: {
input: "$datesArr",
initialValue: {
k: {$dateAdd: {startDate: "$$NOW", amount: -7, unit: "day"}},
v: {recorded_price: {$max: "$datesArr.v.recorded_price"}}
},
in: {
$cond: [
{$and: [
{$gte: [{$dateFromString: {dateString: "$$this.k"}}, "$$value.k"]},
{$lte: ["$$this.v.recorded_price", "$$value.v.recorded_price"]}
]},
{
k: {$dateFromString: {dateString: "$$this.k"}},
v: "$$this.v.recorded_price"
},
"$$value"
]
}
}
}
}
},
{$set: {min_7day_price: "$datesArr.v", datesArr: "$$REMOVE"}}
])
看看它在操場上的例子是如何作業的
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/525257.html
