Ejemplo: Mongo db collection:
[ { "user_id": 1, "lead_id": 901, ... ... }, { "user_id": 2, "lead_id": 902, ... ... }, { "user_id": 2, "lead_id": 903, ... ... }, { "user_id": 3, "lead_id": 999, ... ... }, ]
Tengo una serie de objetos:
const reqArr = [ { "user_id": 1, "lead_id": 901, }, { "user_id": 2, "lead_id": 999, } ]
Quiero consultar la base de datos en función de user_id
y lead_id
presentes en cada objeto de la matriz reqArr
. algo como esto o con tubería agregada
Model.find(reqArr)
Mi salida deseada sería algo como esto:
[{ "user_id": 1, "lead_id": 901, ... ... }]
Solo sé cómo consultar en función de la matriz de un campo como Model.find({_id: {"$in": [array of ids ]}})
pero no con más de un campo en una matriz de objetos. ¿Alguna idea o solución para lograr algo como el resultado anterior o la negación del resultado anterior? Solo necesito qué objetos en reqArr
están presentes en la colección db o cuáles no. Gracias.
La forma más sencilla de hacer lo anterior sería esta:
const results = await Promise.all(reqArr.map(req => { const { user_id, lead_id } = req; return Model.findOne({ user_id, lead_id }); }));
Asignamos sobre cada elemento en reqArr
. Para cada elemento ( req
), lo desestructuramos en dos variables user_id
y lead_id
.
Luego buscamos un solo documento (supongo que solo hay un documento para cada par user_id
y lead_id
, de lo contrario, será necesario ajustarlo ligeramente).
Luego devolvemos la promesa findOne
, lo que da como resultado una serie de promesas que pasamos a Promise.all
para esperarlas todas de forma asíncrona.
Esto debería generar una matriz plana de resultados que coincidan con los pares lead_iq
/ user_id
en reqArr
.
Si algunos de estos combos no están presentes en la base de datos, esos elementos de la matriz no estarán undefined
y podrá manejarlos como lo necesite.
simple $or
db.collection.aggregate([ { "$match": { "$or": [ { "user_id": 1, "lead_id": 901 }, { "user_id": 2, "lead_id": 902 } ] } } ])
nodo
const reqArr = [ { "user_id": 1, "lead_id": 901, }, { "user_id": 2, "lead_id": 999, } ] Model.find({ "$or": reqArr})