Supongamos que tengo este documento MongoDB:
{ "_id": { "$oid": "628f739398580cae9c21b44f" }, "place":"Amsterdam", "events": [ { "eventName": "Event one", "eventText": "Event", "eventDate": "010101" "host":"Bob" }, { "eventName": "E2", "eventText": "e2", "eventDate": "020202" "host":"John" } ] } { "_id": { "$oid": "628f739398580cae9c21b44f" }, "place":"London", "events": [ { "eventName": "e3", "eventText": "e3", "eventDate": "010101", "host":"Bob" } ] } Y quiero obtener el bloque de matriz de eventos organizado por Bob, ¿cómo lo haría? He intentado usar $elemSelector así:
const result = await mongoDatabase .collection("temp") .find({ events: { $elemMatch: { eventName: "E2" } } }) .toArray(); console.log(JSON.stringify({ result }));Pero simplemente devuelve todos los eventos en el mismo lugar que el seleccionado, Amsterdam en este caso.
Resultado buscado:
{ "eventName": "Event one", "eventText": "Event", "eventDate": "010101" "host":"Bob" }, { "eventName": "e3", "eventText": "e3", "eventDate": "010101", "host":"Bob" }Mira esto
db.collection.aggregate({ $unwind: "$events" }, { $match: { "events.host": "Bob" } }, { "$project": { "events": 1, "_id": 0 } }, { "$replaceRoot": { "newRoot": "$events" } })Y puedes jugar con más datos de prueba aquí: https://mongoplayground.net/p/A1UbZdZgZmr
Puede lograrlo con etapas simples de canalización
db.collection.aggregate([ { "$match": {//Match "events.host": "Bob" } }, { "$project": { "e": { "$filter": {//Filter matching elements "input": "$events", "as": "event", "cond": { "$eq": [ "$$event.host", "Bob" ] } } } } } ])La siguiente estructura se puede lograr mediante el uso de consultas de proyección en MongoDB, una solución lúcida para lo anterior puede ser esta
db.collection("temp").find({ "events":{ $elemMatch:{ "eventName":"e3" } } }, {"events":1,"_id":0})