如何将两个数组转换为 mongoDB 中的对象,其中第一个数组具有多个相同的值
How to convert two array into an object in mongoDB where the first array has multiple same values
在使用 mongo 聚合进行一些处理后,我有一个像这样的集合:
[{
field1: 10,
field2: 50,
field3: {
name: ["a","b","a","a"],
value: [1,2,3,4]
}
},...]
我正在努力寻找一种方法将其转换为:
[{
field1: 10,
field2: 50,
a:[1,3,4],
b:[2]
},...]
在mongoshell或罗盘
中使用mongo聚合
所以想法是:
- 从
field3
中选择一个数组说name
生成数组范围[0, 1, 2, 3]
。
- 同时遍历
name
和value
数组得到{ k: "", v: "" }
. 的数组
$unwind
上一阶段的数组进行分组。
- 按键分组
field3.k
以累积所有值 field3.v
。
- 再次按
null
分组生成模式数组 { k: "", v: "" }
。
- 将
field1
和 field2
连接到前一阶段的数组中。
- 最后使用
$arrayToObject
将数组转换为对象。
试试这个:
db.testCollection.aggregate([
{
$addFields: {
field3: {
$map: {
input: { $range: [0, { $size: "$field3.name" }] },
as: "index",
in: {
k: { $arrayElemAt: ["$field3.name", "$$index"] },
v: { $arrayElemAt: ["$field3.value", "$$index"] }
}
}
}
}
},
{ $unwind: "$field3" },
{
$group: {
_id: "$field3.k",
field1: { $first: "$field1" },
field2: { $first: "$field2" },
k: { $first: "$field3.k" },
v: { $push: "$field3.v" }
}
},
{
$group: {
_id: null,
field1: { $first: "$field1" },
field2: { $first: "$field2" },
array: {
$push: { k: "$k", v: "$v" }
}
}
},
{
$addFields: {
array: {
$concatArrays: [
[{ k: "field1", v: "$field1" }, { k: "field2", v: "$field2" }],
"$array"
]
}
}
},
{
$replaceRoot: {
newRoot: { $arrayToObject: "$array" }
}
}
]);
输出
{
"field1" : 10,
"field2" : 50,
"a" : [
1,
3,
4
],
"b" : [
2
]
}
在使用 mongo 聚合进行一些处理后,我有一个像这样的集合:
[{
field1: 10,
field2: 50,
field3: {
name: ["a","b","a","a"],
value: [1,2,3,4]
}
},...]
我正在努力寻找一种方法将其转换为:
[{
field1: 10,
field2: 50,
a:[1,3,4],
b:[2]
},...]
在mongoshell或罗盘
中使用mongo聚合所以想法是:
- 从
field3
中选择一个数组说name
生成数组范围[0, 1, 2, 3]
。 - 同时遍历
name
和value
数组得到{ k: "", v: "" }
. 的数组
$unwind
上一阶段的数组进行分组。- 按键分组
field3.k
以累积所有值field3.v
。 - 再次按
null
分组生成模式数组{ k: "", v: "" }
。 - 将
field1
和field2
连接到前一阶段的数组中。 - 最后使用
$arrayToObject
将数组转换为对象。
试试这个:
db.testCollection.aggregate([
{
$addFields: {
field3: {
$map: {
input: { $range: [0, { $size: "$field3.name" }] },
as: "index",
in: {
k: { $arrayElemAt: ["$field3.name", "$$index"] },
v: { $arrayElemAt: ["$field3.value", "$$index"] }
}
}
}
}
},
{ $unwind: "$field3" },
{
$group: {
_id: "$field3.k",
field1: { $first: "$field1" },
field2: { $first: "$field2" },
k: { $first: "$field3.k" },
v: { $push: "$field3.v" }
}
},
{
$group: {
_id: null,
field1: { $first: "$field1" },
field2: { $first: "$field2" },
array: {
$push: { k: "$k", v: "$v" }
}
}
},
{
$addFields: {
array: {
$concatArrays: [
[{ k: "field1", v: "$field1" }, { k: "field2", v: "$field2" }],
"$array"
]
}
}
},
{
$replaceRoot: {
newRoot: { $arrayToObject: "$array" }
}
}
]);
输出
{
"field1" : 10,
"field2" : 50,
"a" : [
1,
3,
4
],
"b" : [
2
]
}