MongoDB 乘以对象值?
MongoDB multiply object values?
我在 MongoDB 中有以下结构:
{
"system_id": 133657,
"type": "personal",
"prices": {
"7": {
"min": 0.05,
"max": 0.05,
"avg": 0.05,
"sales": 1
},
"14": {
"min": 0.05,
"max": 0.05,
"avg": 0.05,
"sales": 3
},
"30": {
"min": 0.03,
"max": 0.04,
"avg": 0.03,
"sales": 8
}
},
"prices_updated_at": { "$date": "2022-05-25T04:48:43.469Z" }
}
是否可以将所有价格值(最小值、最大值、平均值)迭代并乘以例如 2 并以相同的结构输出?键 (1, 7, 14) 不固定,可以有不同的值,具体取决于销售统计数据。
我发现的只是数组,与对象无关。
感谢您的帮助!
您可以使用以下技巧:
db.collection.aggregate([
{
"$addFields": {
"prices": {
"$objectToArray": "$prices"
}
}
},
{
"$addFields": {
"prices": {
$map: {
input: "$prices",
as: "p",
in: {
"k": "$$p.k",
"v": {
"min": {
$multiply: [
"$$p.v.min",
2
]
},
"max": {
$multiply: [
"$$p.v.max",
2
]
},
"avg": {
$multiply: [
"$$p.v.avg",
2
]
},
"sales": "$$p.v.sales"
}
}
}
}
}
},
{
"$addFields": {
"prices": {
"$arrayToObject": "$prices"
}
}
}
])
解释:
- 将价格对象转换为数组
- 现在使用 $map 将所有最小值、最大值和平均值乘以 2
- 从数组转换回对象(返回原始结构)
同样的事情可以在单个 $addFields 操作中完成,预计性能会更好,但人类可读性不高:
我在 MongoDB 中有以下结构:
{
"system_id": 133657,
"type": "personal",
"prices": {
"7": {
"min": 0.05,
"max": 0.05,
"avg": 0.05,
"sales": 1
},
"14": {
"min": 0.05,
"max": 0.05,
"avg": 0.05,
"sales": 3
},
"30": {
"min": 0.03,
"max": 0.04,
"avg": 0.03,
"sales": 8
}
},
"prices_updated_at": { "$date": "2022-05-25T04:48:43.469Z" }
}
是否可以将所有价格值(最小值、最大值、平均值)迭代并乘以例如 2 并以相同的结构输出?键 (1, 7, 14) 不固定,可以有不同的值,具体取决于销售统计数据。
我发现的只是数组,与对象无关。
感谢您的帮助!
您可以使用以下技巧:
db.collection.aggregate([
{
"$addFields": {
"prices": {
"$objectToArray": "$prices"
}
}
},
{
"$addFields": {
"prices": {
$map: {
input: "$prices",
as: "p",
in: {
"k": "$$p.k",
"v": {
"min": {
$multiply: [
"$$p.v.min",
2
]
},
"max": {
$multiply: [
"$$p.v.max",
2
]
},
"avg": {
$multiply: [
"$$p.v.avg",
2
]
},
"sales": "$$p.v.sales"
}
}
}
}
}
},
{
"$addFields": {
"prices": {
"$arrayToObject": "$prices"
}
}
}
])
解释:
- 将价格对象转换为数组
- 现在使用 $map 将所有最小值、最大值和平均值乘以 2
- 从数组转换回对象(返回原始结构)
同样的事情可以在单个 $addFields 操作中完成,预计性能会更好,但人类可读性不高: