Mis documentos:
[{ "_id":"621c6e805961def3332bcf97", "title":"monk plus", "brand":"venture electronics", "category":"earphones", "variant":[ { "price":1100, "impedance":"16ohm" }, { "price":1600, "impedance":"64ohm" }], "salesCount":185, "buysCount":182, "viewsCount":250 }, { "_id":"621c6dab5961def3332bcf92", "title":"nokia1", "brand":"nokia", "category":"mobile phones", "variant":[ { "price":10000, "RAM":"4GB", "ROM":"32GB" }, { "price":15000, "RAM":"6GB", "ROM":"64GB" }, { "price":20000, "RAM":"8GB", "ROM":"128GB" }], "salesCount":34, "buysCount":21, "viewsCount":80 }]Rendimiento esperado
[{ _id:621c6e805961def3332bcf97 title:"monk plus" brand:"venture electronics" category:"earphones" salesCount:185 viewsCount:250 variant:[ { price:1100 impedance:"16ohm" }] }]He probado este método de agregación.
[{ $match: { 'variant.price': { $gte: 0,$lte: 1100 } }}, { $project: { title: 1, brand: 1, category: 1, salesCount: 1, viewsCount: 1, variant: { $filter: { input: '$variant', as: 'variant', cond: { $and: [ { $gte: ['$$variant.price',0] }, { $lte: ['$$variant.price',1100] } ] } } } }}]Este método devuelve el resultado esperado, ahora mi pregunta es si hay algún otro enfoque mejor que devuelva el resultado esperado. Además, gracias de antemano, y como soy nuevo en la base de datos nosql, tengo curiosidad por aprender de la comunidad. Tome nota sobre resultado esperado todas las propiedades de un documento en particular deben devolver solo la matriz variante del objeto que quiero filtrar según el precio.
su solución es buena, solo asegúrese de aplicar su $ coincidencia y paginación antes de aplicar este paso para consultas más rápidas
No hay nada malo con su canalización de agregación y hay otras formas de hacerlo. Si solo desea devolver documentos coincidentes, con solo el primer elemento de matriz coincidente , aquí hay otra forma de hacerlo. (Desafortunadamente, la sintaxis .$ solo devuelve la primera coincidencia).
db.collection.find({ // matching conditions "variant.price": { "$gte": 0, "$lte": 1100 } }, { title: 1, brand: 1, category: 1, salesCount: 1, viewsCount: 1, // only return first array element that matched "variant.$": 1 })Pruébalo en mongoplayground.net .
O bien, si desea utilizar una canalización de agregación y devolver todos los documentos coincidentes en su totalidad, excepto la matriz filtrada, puede simplemente "sobrescribir" la matriz con los elementos que desee mediante "$set" (o su alias "$addFields" ). . Hacer esto significa que no necesitarás "$project" nada.
db.collection.aggregate([ { "$match": { "variant.price": { "$gte": 0, "$lte": 1100 } } }, { "$set": { "variant": { "$filter": { "input": "$variant", "as": "variant", "cond": { "$and": [ { "$gte": [ "$$variant.price", 0 ] }, { "$lte": [ "$$variant.price", 1100 ] } ] } } } } } ])Pruébalo en mongoplayground.net .