https://mongoplayground.net/p/xQp-y1iXUtZ
Hay 2 colecciones:
Después de una búsqueda, la colección externa se devuelve como una matriz. Dado que solo puede haber un elemento en esa matriz (un sub solo puede tener un perfil), tomamos el primero.
Ahora, también me gustaría "empujar" la colección "subs" a un objeto. Hay muchos campos en "subs".
Esto es lo que tengo:
[ { "PROFILE0": { "_id": "1", "name": "gk" }, "_id": "1", "f1": "f1", "f2": "f1", "f3": "f1", "f4": "f1", "username": "gk" }, { "PROFILE0": { "_id": "1", "name": "gk" }, "_id": "2", "f1": "f1", "f2": "f3", "f3": "f4", "f4": "f5", "username": "gk" } ]Esto es lo que estoy buscando:
[ { "PROFILE0": { "_id": "1", "name": "gk" }, "SUBS": { "_id": "1", "f1": "f1", "f2": "f1", "f3": "f1", "f4": "f1", "username": "gk" } }, { "PROFILE0": { "_id": "1", "name": "gk" }, "SUBS": { "_id": "2", "f1": "f1", "f2": "f3", "f3": "f4", "f4": "f5", "username": "gk" } } ]Esencialmente, el contenido de la colección "local" también como un objeto.
Agrega proyección antes de la búsqueda,
$project para crear un campo SUBS y establecer $$ROOT como el valor que es el documento raíz$lookup para unirse a la colección de perfiles, pase SUBS.username de usuario como localField y establezca PROFILE0 as valor, y no necesitamos la etapa $unset$set lo mismo que hiciste db.subs.aggregate([ { $project: { _id: 0, SUBS: "$$ROOT" } }, { $lookup: { from: "profile", localField: "SUBS.username", foreignField: "name", as: "PROFILE0" } }, { $set: { "PROFILE0": { $arrayElemAt: ["$PROFILE0", 0] } } } ])