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.