Tengo datos que tienen claves principales de usuario en "user.pk" y "usertags.user.pk" .
[ { _id: ObjectId("62015250cb18d3cadb32c38e"), user: { pk: '7485070525' }, usertags: [ { user: { pk: '334777488' } } ] }, { _id: ObjectId("62015250cb18d3cadb32c38f"), user: { pk: '334777488' }, usertags: [ { user: { pk: '7485070525' } }, { user: { pk: '271738610' } }, { user: { pk: '31961021' } } ] } ] Estoy buscando agregar todos estos datos en una sola lista de todas las claves principales de usuario distintas, por lo que el resultado de los datos anteriores sería algo así como { _id: null, user_pks: [7485070525, 334777488, 271738610, 31961021] }
Intenté usar la agregación de $group , pero no puedo descifrar cómo fusionar "user.pk" y "usertags.user.pk" . Alguien me puede ayudar con eso?
Editar: esto es lo más cercano que he obtenido, lo que coloca a los usuarios y las etiquetas de usuario en listas separadas.
db.collection.aggregate([ { $unwind: "$usertags" }, { $group: { _id: null, users: { $push: "$user.pk" }, usertags: {$push: "$usertags.user.pk" } } }, ])Puedes hacerlo:
pruébalo aquí parque infantil mongodb
db.collection.aggregate([ { $group: { _id: null, user_pk: { $push: "$user.pk" }, user_sub_pk: { $push: "$usertags" } }, }, // flattern array in user_sub_pk { $set: { user_sub_pk: { $reduce: { input: "$user_sub_pk", initialValue: [], in: { $concatArrays: [ "$$value", "$$this" ], }, }, }, }, }, { $project: { user_pks: { $concatArrays: [ "$user_pk", "$user_sub_pk.user.pk" ], }, }, // remove duplicate items { "$project": { "user_pks": { "$setUnion": [ "$user_pks", [] ] } } } } ])actualización: refactorizado por @zrbecker
db.collection.aggregate([ { $group: { _id: null, users: { $push: "$user.pk" }, usertags: { $push: "$usertags.user.pk" } } }, { $project: { users: { $setUnion: [ "$users", { $reduce: { input: "$usertags", initialValue: [], in: { $concatArrays: [ "$$value", "$$this" ] } } } ] } } } ])