Soy nuevo en el marco de agregación y tengo el siguiente problema/pregunta.
Mis colecciones se ven así:
usuarios
_id: ObjectId('604caef28aa89e769585f0c4') baseData: { firstName: "max" username: "max_muster" ... ... }actividadesFeed
_id: ObjectId('604cb97c99bbd77b54047370') userID: "604caef28aa89e769585f0c4" // the user id activity: "604caf718aa89e769585f0c8" // the activity id viewed: falseactividades
_id: ObjectId('604caf718aa89e769585f0c8') "baseData": { "userID":"604caef28aa89e769585f0c4", "type":0, "title":"Alessandro send you a friend request.", "description":"", "actionID":"604caef28aa89e769585f0c4" },función agregada
const response = ActivityFeed.aggregate([ { $match: { userID: ObjectId(args.user) }, }, { $lookup: { from: 'activities', localField: 'activity', foreignField: '_id', as: 'lookup_activities', }, }, { $unwind: '$activities' }, { $lookup: { from: 'users', localField: 'lookup_activities.baseData.actionID', foreignField: '_id', as: 'lookup_users', }, }, ]);¿Cómo puedo hacer una búsqueda con el primer resultado de búsqueda?
Hice una búsqueda en la colección de actividades. Esta colección contiene la identificación para la segunda búsqueda baseData.userID. Pero con este enfoque no tengo ningún resultado con la segunda búsqueda.
La razón por la que me uní a la colección de actividades es que el ID de acción puede contener un ID de usuario o un ID de documento de otra colección. Depende del tipo en la colección de actividades.
¿Es posible en el marco de agregación realizar una búsqueda que dependa del tipo y de la búsqueda anterior?
Gracias de antemano.
Todo lo que hice fue arreglar tu agregación. Desenreda el campo incorrecto y asegúrese de que todos sus campos de ID sean ObjectId. Recomiendo encarecidamente usar MongoDB Compass para ayudar en su agregación si es nuevo en la función de agregación. Tienen una GUI de asistencia etapa por etapa que realmente hará su vida más fácil.
db.activitiesFeed.aggregate([ { $match: { userID: ObjectId("604caef28aa89e769585f0c4") }, }, { $lookup: { from: "activities", localField: "activity", foreignField: "_id", as: "lookup_activities", }, }, { $unwind: "$lookup_activities" }, { $lookup: { from: "users", localField: "lookup_activities.baseData.actionID", foreignField: "_id", as: "lookup_users", }, }, ])Muestra utilizada
db={ "users": [ { _id: ObjectId("604caef28aa89e769585f0c4"), baseData: { firstName: "max", username: "max_muster" } } ], "activitiesFeed": [ { _id: ObjectId("604cb97c99bbd77b54047370"), userID: ObjectId("604caef28aa89e769585f0c4"), activity: ObjectId("604caf718aa89e769585f0c8"), viewed: false } ], "activities": [ { _id: ObjectId("604caf718aa89e769585f0c8"), "baseData": { "userID": ObjectId("604caef28aa89e769585f0c4"), "type": 0, "title": "Alessandro send you a friend request.", "description": "", "actionID": ObjectId("604caef28aa89e769585f0c4") }, } ] }