Aquí está el código en el patio de recreo de mongodb .
Tengo una consulta que se ve a continuación:
db.posts.aggregate({ $lookup: { from: "users", let: {comments: "$comments"}, pipeline: [ {$match: {$expr: {$in: ["$_id", "$$comments.userId"]} }}, {"$addFields":{"text": "$$comments.text"}} ], as: "comments" } }) El problema con esta consulta es que el valor de text que obtengo es una matriz que contiene los textos de todos los comments . Si trato de filtrar por userId de usuario, tengo otro problema. Si un usuario ha comentado más de una vez, el valor del text será una matriz que contiene todos sus comments .
¿Cómo puedo obtener el usuario buscado y su comentario como en un objeto?
EDITAR
Espero un resultado que se ve a continuación:
[ { "_id": ObjectId("5a934e000102030405000000"), "id": "1", "comments": [ { "_id": "u1", "name": "James", "username": "jamo", "text": "Hi there, who are you?" }, { "_id": "u1", "name": "James", "username": "jamo", "text": "Hi! Are you still there?" } ], } ]$unwind deconstruye la matriz de comments$lookup unirse a la colección de usuarios,$unwind obtener objeto de user$group por _id y reconstruir comments con campos obligatorios db.posts.aggregate([ { $unwind: "$comments" }, { $lookup: { from: "users", localField: "comments.userId", foreignField: "_id", as: "comments.user" } }, { $unwind: "$comments.user" }, { $group: { _id: "$_id", id: { $first: "$id" }, comments: { $push: { _id: "$comments._id", text: "$comments.text", username: "$comments.user.username", name: "$comments.user.name" } } } } ]) Segunda opción, sin $unwind ,
$lookup con la colección de users$map para iterar el bucle de la matriz de comments$filter para iterar el aspecto de la matriz de users y encontrar información de usuario coincidente$arrayElemAt devuelve el primer objeto del usuario filtrado de $filter$mergeObjects combinará el objeto de comentario y la información del usuario db.posts.aggregate([ { $lookup: { from: "users", localField: "comments.userId", foreignField: "_id", as: "users" } }, { $project: { comments: { $map: { input: "$comments", as: "c", in: { $mergeObjects: [ "$$c", { $arrayElemAt: [ { $filter: { input: "$users", cond: { $eq: ["$$c.userId", "$$this._id"] } } }, 0 ] } ] } } } } } ])No he probado el rendimiento de ambas consultas, intente y use la consulta adecuada