假设在聚合阶段收到以下集合:
{
customer: "WN",
parameter: "category_a",
locations: [
{
city: "Elkana",
category_a: 11904.0,
category_b: 74.0,
category_c: 657.0,
},
{
city: "Haifa",
category_a: 20.0,
category_b: 841.0,
category_c: 0,
}
]
}
{
customer: "QKD",
parameter: "category_b",
locations: [
{
city: "Tel Aviv",
category_a: 0,
category_b: 22.0,
category_c: 612.0,
}
}
{
....
}
parameter
字段中的值引用嵌套文档中的字段名称。
在下一阶段,我想在每个嵌套文档中创建一个新字段(我将其称为category
),并在嵌套文档字段中分配一个值(的值category_a
或的值category_b
或的值category_c
)。将使用该字段中的值来选择将从哪个字段中获取值parameter
。
结果可能如下所示:
{
customer: "WN",
parameter: "category_a",
locations: [
{
city: "Elkana",
category_a: 11904.0,
category_b: 74.0,
category_c: 657.0,
category: 11904.0
},
{
city: "Haifa",
category_a: 20.0,
category_b: 841.0,
category_c: 0,
category: 20.0
}
]
}
{
customer: "QKD",
parameter: "category_b",
locations: [
{
city: "Tel Aviv",
category_a: 0,
category_b: 22.0,
category_c: 612.0,
category: 22.0
}
]
}
{
....
}
您可以尝试使用$map
和$reduce
,
locations
数组$cond
将检查parameter
和k
匹配,然后合并对象使用$ mergeObjects。db.collection.aggregate([
{
$addFields: {
locations: {
$map: {
input: "$locations",
as: "l",
in: {
$reduce: {
input: { $objectToArray: "$$l" },
initialValue: "$$l",
in: {
$cond: [
{ $eq: ["$$this.k", "$parameter"] },
{ $mergeObjects: ["$$value", { category: "$$this.v" }] },
"$$value"
]
}
}
}
}
}
}
}
])
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句