Digamos que tengo los siguientes documentos en una colección:
{ "_id" : ObjectId("111e2133c57a1d6111111111"), "scores" : [ { "date" : ISODate("2021-03-29T05:00:20.965Z"), "test 1 points" : 50, "test 2 points" : 10, "total possible points" : 100 } ] } { "_id" : ObjectId("111e2133c57a1d6111111222"), "scores" : [ { "date" : ISODate("2021-03-27T05:00:20.965Z"), "test 1 points" : 30, "test 2 points" : 20, "total possible points" : 200 } ] }Si quiero encontrar todos los documentos que tienen ("puntos de prueba 1" + "puntos de prueba 2") / "puntos posibles totales" mayores que .50, ¿hay alguna manera de hacerlo de manera eficiente con el comando MongoDB find ()?
Actualmente, estoy usando el método ineficiente de recorrer cada documento y realizar mis cálculos, luego registro el ObjectId si el valor calculado es mayor que .50.
¡Gracias por adelantado!
Demostración - https://mongoplayground.net/p/c19Xx9-Ahb-
$desenrolle los puntajes para entrar en documentos individuales, use $add $divide with $gt to validEntry como verdadero o falso.
y $hacer coincidir los documentos
db.collection.aggregate([ { $unwind: "$scores" }, { $addFields: { validEntry: { $gt: [ { $divide: [ { $add: [ "$scores.test 1 points", "$scores.test 2 points" ] }, "$scores.total possible points" ] }, 0.5] } } }, { $match: { validEntry: true } } ]) si desea recuperar el documento original $ agrúpelos por _id y $ empuje las puntuaciones de vuelta a la matriz.
{ $group: { _id: "_id", scores: { $push: "$scores" } } }