Quiero escribir un ejemplo de consulta de $búsqueda User.aggregate([{ $match }]).lookup({... para enumerar usuarios con clave adicional _team donde el usuario está asignado como miembro en cualquiera del equipo. Esto es la colección mongo de ejemplo -
1ra colección
# Users Collection - { "_id": "1", "name": "Sankhnad" }, { "_id": "2", "name": "Shweta" }2da colección
# Teams Collection - { "_id": "1", "name": "Rock Team", "_members": [ 2 ] }, { "_id": "2", "name": "Star Team",, "_members": [ 1, ] }, { "_id": "3", "name": "Yeh Team", "_members": [ 1, 2 ] } Ahora quiero una única consulta de $búsqueda/agregado en la colección de users y teams para enumerar todos los usuarios y sus respectivos equipos o un usuario seleccionado y sus equipos donde el usuario ha sido asignado en _members .
El resultado esperado para todos los usuarios:
# Output - { "_id": "1", "name": "Sankhnad", "_teams": [ { "_id": "2", "name": "Star Team",, "_members": [ 1, ] }, { "_id": "3", "name": "Yeh Team", "_members": [ 1, 2 ] } ] }, { "_id": "2", "name": "Shweta", "_teams": [ { "_id": "1", "name": "Rock Team", "_members": [ 2 ] }, { "_id": "3", "name": "Yeh Team", "_members": [ 1, 2 ] } ] }Realmente agradezco a todos ustedes por el apoyo.
Consulta
$eq )$toInt users.aggregate( [{"$set":{"nid":{"$toInt":"$_id"}}}, {"$lookup": {"from":"teams", "localField":"nid", "foreignField":"_members", "as":"_teams"}}, {"$unset":["nid"]}])Puede usar $búsqueda de la siguiente manera en la tabla de usuarios, ya que desea los equipos asociados de los usuarios.
Nota: La identificación de _members debe ser una cadena , no int32 para la búsqueda. Si no fuera una cadena, entonces es necesaria la conversión de tipo .
db.users.aggregate([$lookup:{ from: 'teams', localField: '_id', foreignField: '_members', as: 'teams' }])La misma consulta que utiliza la canalización de la búsqueda le gustaría
db.users.aggregate[{ from: 'teams', let:{ids:"$_id"}, pipeline:[{ $match:{ $expr:{ $in:["$$ids","$_members"] } } }], as: '_teams' }])Podemos hacer algo como a continuación:
db.users.aggregate([ {$match: {deleted: false}}, // Put condition in user collection if needed { $lookup: { from: "teams", localField: "_id", foreignField: "_members", as: "team" } }, {$unwind: { path: "$team", preserveNullAndEmptyArrays: true}}, { $project: { // To show only the records that you want "_id": 1, "name": 1, "team._id": 1, "team.name": 1, "team._members": 1 } } ]);