Trato de encontrar documentos donde la tasa de propiedad en el objeto es mayor que la tasa de propiedad en otro objeto (ambos están en la misma matriz)
Documento de ejemplo:
{ "rates": [ { "name": "x", "rate": 5 }, { "name": "y", "rate": 4 } ] }Así es como lo intenté:
db.ratesCollection.find({ $where: {"rates": { $elemMatch: {name: "x", "rate"}}} > {"rates": { $elemMatch: {name: "y", "rate"}}} }).pretty()El problema es que no sé cómo comparar valores cuando primero necesito encontrar un objeto en una matriz.
Puede usar $reduce para procesar la matriz y obtener x_rate y y_rate . Después de eso, compare los 2 valores para obtener el resultado.
db.collection.aggregate([ { "$addFields": { "x_rate": { "$reduce": { "input": "$rates", "initialValue": null, "in": { $cond: [ { $eq: [ "$$this.name", "x" ] }, "$$this.rate", "$$value" ] } } }, "y_rate": { "$reduce": { "input": "$rates", "initialValue": null, "in": { $cond: [ { $eq: [ "$$this.name", "y" ] }, "$$this.rate", "$$value" ] } } } } }, { $match: { $expr: { $gt: [ "$x_rate", "$y_rate" ] } } }, { "$project": { x_rate: false, y_rate: false } } ])Aquí está el parque infantil de Mongo para su referencia.
Consulta
x>y <=> xy > 0xy y comprobar si es mayor que 0value=0 si encontramos x sumamos si encontramos y restamos, de lo contrario mantenemos el valor como está aggregate( [{"$match": {"$expr": {"$gt": [{"$reduce": {"input":"$rates", "initialValue":0, "in": {"$switch": {"branches": [{"case":{"$eq":["$$this.name", "x"]}, "then":{"$add":["$$value", "$$this.rate"]}}, {"case":{"$eq":["$$this.name", "y"]}, "then":{"$subtract":["$$value", "$$this.rate"]}}], "default":"$$value"}}}}, 0]}}}])