Después de un procesamiento con una agregación de mongo, tengo una colección como:
[{ field1: 10, field2: 50, field3: { name: ["a","b","a","a"], value: [1,2,3,4] } },...]Estoy luchando por encontrar una manera de convertirlo en:
[{ field1: 10, field2: 50, a:[1,3,4], b:[2] },...]Usando la agregación mongo en mongoshell o compass
Entonces la idea es:
field3 3, diga el name para generar el rango de matriz [0, 1, 2, 3] .name y value simultáneamente para obtener una matriz de { k: "", v: "" } .$unwind la matriz de la etapa anterior para agruparla.field3.k para acumular todos los valores field3.v .null para generar una matriz de patrón { k: "", v: "" } .field1 y field2 en la matriz de la etapa anterior.$arrayToObject .Prueba esto:
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" } } } ]);Producción
{ "field1" : 10, "field2" : 50, "a" : [ 1, 3, 4 ], "b" : [ 2 ] }