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] } } } ])