A continuación se muestra el modelo de datos MongoDB de muestra para una colección de user :
{ "_id": ObjectId('58842568c706f50f5c1de662'), "userId": "123455", "user_name":"Bob" "interestedTags": [ "music", "cricket", "hiking", "F1", "Mobile", "racing" ], "listFriends": [ "123456", "123457", "123458" ] } listFriends es una matriz de userId de usuario para otros usuarios
Para un ID de userId en particular, necesito extraer los amigos de la listFriends ( userId de usuario) y para esos userId de usuario, necesito agregar las etiquetas interestedTags y su recuento.
Podría lograr esto dividiendo la consulta en dos partes:
1.) Extraiga la lista de listFriends para un ID de usuario en userId ,
2.) Use esta lista en una función de aggregate() , algo como esto
db.user.aggregate([ { $match: { userId: { $in: [ "123456","123457","123458" ] } } }, { $unwind: '$interestedTags' }, { $group: { _id: '$interestedTags', countTags: { $sum : 1 } } } ])Estoy tratando de resolver la pregunta: ¿Hay alguna manera de lograr la funcionalidad anterior (ambos pasos 1 y 2) en una sola función agregada?
Podrías usar $lookup para buscar documentos de amigos. Esta etapa generalmente se usa para unir dos colecciones diferentes, pero también puede unirse en una sola colección, en su caso creo que debería estar bien:
db.user.aggregate([{ $match: { _id: 'user1', } }, { $unwind: '$listFriends', }, { $lookup: { from: 'user', localField: 'listFriends', foreignField: '_id', as: 'friend', } }, { $project: { friend: { $arrayElemAt: ['$friend', 0] } } }, { $unwind: '$friend.interestedTags' }, { $group: { _id: '$friend.interestedTags', count: { $sum: 1 } } }]); Nota: utilizo $lookup y $arrayElemAt , que solo están disponibles en Mongo 3.2 o una versión más reciente, así que verifique su versión de Mongo antes de usar esta canalización.