Tengo una consulta con agregación para MongoDB en mi código nodejs.
const query = { '$expr':{ '$and':[ {'$eq': ['$appId', req.user.appId]}, ] } }
Desde la interfaz, se recibe un objeto de filtro, de la siguiente manera:
{ shops: '604c776763c302032e610347', offset: '0', limit: '20', }
Necesito insertar dinámicamente la identificación de las tiendas en mi consulta. debe ser appId -> user.appID Y targetFrom || targetTo <- tiendas ( desde el objeto de filtro )
las tiendas pueden ser una identificación o una matriz de identificaciones , para esto estoy usando el operador $in
query['$expr']['$and'].push({ $eq: [ { $or: [ {"targetFrom": {$in: bb}}, {"targetTo": {$in: bb}} ] } ] })
La versión anterior del código era la siguiente:
const query = { $and: [ {appId: req.user.appId} ] } query['$and'].push({ $or: [ {"targetFrom": {$in: bb}}, <- in bb is mongodb objectID {"targetTo": {$in: bb}} ] })
¿Cómo puedo buscar algún item
por ID en mi matriz de items
?
if(req.query.products) { typeof req.query.products === 'string' ? req.query.products = [req.query.products] : req.query.products let bb = req.query.products.map(function(el) { return mongoose.Types.ObjectId(el) }) query['$expr']['$and'].push({ $and: [ { items: { $in: ['item.itemId', bb] } } ] }) }
Por favor, vea si lo siguiente responde a su requerimiento:
Enlace al parque infantil Mongo
req.user.appId
es una cadena.bb
es una matriz de objectIds o cadenas ( [ObjectId("asdfsd"),ObjectId("badsfds")]
, etc.) const query = { "$expr": { $and: [{ "$eq": ["$appId",req.user.appId], }] } } query['$expr']['$and'].push({ $or: [ { $in: [ "$targetFrom", bb ] }, { $in: [ "$targetTo", bb ] } ] })
targetTo
appId
targetFrom
de una matriz dada, y la date
está entre la fecha de startDate
y la fecha de endDate
: En el mongoplayground anterior, busco todos los objetos donde appId
es "1", startDate
es 2022-01-01
, endDate
es 2022-01-31
y bb es ["a","c","x"] . Esto debería obtener los 3 documentos, pero la fecha filtra el tercer documento, porque la date
en ese documento es 2021-12-24
. Si cambia la fecha antes de eso, obtendrá los 3.
const query = { "$expr": { $and: [{ "$eq": ["$appId",req.user.appId], }] } } query['$expr']['$and'] = query['$expr']['$and'].concat([{ $and: [ { $gte: [ "$date", startDate ] }, { $lt: [ "$date", endDate ] } ] },{ $or: [ { $in: [ "$targetFrom", bb ] }, { $in: [ "$targetTo", bb ] } ] }])
items.id
.Enlace del parque infantil Mongo
SI desea filtrar documentos si ningún objeto en los items
tiene la identificación dada, simplemente agregue el objeto adicional que agregué en la matriz $and
en la $match stage
.
{ $in: [ 1, "$items.id", ] }
SI no desea filtrar dichos documentos, pero desea filtrar todos los objetos en los items
donde items.id
NO es la ID dada, la única solución que pude encontrar es usar una etapa $project
, agregada en el nuevo mongoplayground Enlace.