Tengo esta matriz de eventos, pero no puedo averiguar cómo consultar la matriz anidada de 'invitados' y hacer dos cosas.
cuenta el numero de invitados
cuente el número de invitados atendidos (marcados como 'Y')
{ _id: new ObjectId('1'), name: event1, guests: [ { phone: +12222222222, _id: new ObjectId, attended: 'Y' }, { phone: +12344466666, _id: new ObjectId, attended: 'Y' }, { phone: +11234567890, _id: new ObjectId, attended: }, { phone: +14443332222, _id: new ObjectId, attended: 'Y' }, { phone: +19090909090, _id: new ObjectId attended: } ], }, { _id: new ObjectId('2'), name: event2, guests: [ { phone: +11111111111, _id: new ObjectId, attended: }, { phone: +12222222222, _id: new ObjectId, attended: 'Y' }, { phone: +133333333333, _id: new ObjectId, attended: 'Y' } ], },Mi código a continuación está en su iteración número 20 sin acercarse más.
const event = await Event.findById(req.params.id);Para la consulta de MongoDB, puede usar $size para calcular el tamaño del campo de matriz y $filter para filtrar documentos específicos que coincidieron con los criterios de la proyección.
db.collection.find({ _id: "1" }, { _id: 1, name: 1, guests: 1, totalGuests: { $size: "$guests" }, attendedGuests: { $size: { "$filter": { input: "$guests", cond: { $eq: [ "$$this.attended", "Y" ] } } } } })Yong Shun ayudó arriba, pero no obtuvo el 100% del camino; aquí está la respuesta completa en caso de que alguien se encuentre con algo como esto en el futuro:
module.exports.showEvent = async (req, res) => { const event = await Event.findById(req.params.id).populate('artist'); const { guest_id } = req.cookies; let totalGuests = 0; let attendedGuests = 0; const eventData = await Event.aggregate([ { "$match": { "_id": objectId(req.params.id) } }, { $project: { _id: 1, name: 1, guests: 1, totalGuests: { $cond: { if: { $isArray: "$guests" }, then: { $size: "$guests" }, else: "NA" } }, attendedGuests: { $size: { $filter: { input: "$guests", as: "guest", cond: { $and: [{ $eq: ["$$guest.attended", "Y"] }] } } } } } } ]) if (eventData && Array.isArray(eventData) && eventData.length > 0) { totalGuests = eventData[0].totalGuests; attendedGuests = eventData[0].attendedGuests; } if (!event) { req.flash('error', 'Cannot find that Event'); return res.redirect('/events'); } res.render('events/show', { event, eventData }); console.log(totalGuests, attendedGuests); };