Tengo un objeto de mangosta de muestra que se ve así:
{ _id: 5fa849ad4f6be0382363809c, ratings: { ratedPersonId: 7, rating: 7, timeSpent: 30, timestamp: 78, userThreshold: 5 } }, contiene un _id y una lista de calificaciones que es un subdocumento con las siguientes características.
He creado una tubería de agregación como esta:
const ratedUser = await this.ratingModel .aggregate([ { $project: { ratings: 1 } }, { $unwind: '$ratings' }, { $match: { $and: [{ 'ratings.ratedPersonId': userId }, { 'ratings.rating': { $gte: 5 } }], }, }, ]) .exec() Esto funciona para las calificaciones de la primera condición.ratedPersonId ratings.ratedPersonId: userId
Mi problema es que mi segunda condición es que la calificación debe ser mayor o igual que el campo userThreshold de usuario en el mismo objeto.
cada vez que escribo eso en la consulta no devuelve nada
$and: [{ 'ratings.ratedPersonId': userId }, { 'ratings.rating': { $gte: 'ratings.threshold'} }],Demostración: https://mongoplayground.net/p/AQMsJGkoFcu
Use $expr para comparar los campos
Leer expresiones de agregación
$expr puede crear expresiones de consulta que comparen campos del mismo documento en una etapa de $match. Si la etapa $match es parte de una etapa $lookup, $expr puede comparar campos usando variables let. Consulte Especificar varias condiciones de unión con $lookup para ver un ejemplo. $expr solo usa índices en la colección para coincidencias de igualdad en una etapa de $match. $expr no admite índices multiclave.
db.collection.aggregate([ { $project: { ratings: 1 } }, { $unwind: "$ratings" }, { $match: { $and: [ { "ratings.ratedPersonId": 7 }, { $expr: { $gte: [ "$ratings.rating", "$ratings.userThreshold" ] } } ], }, }, ])