por favor ayúdenme, estoy tratando de acercarme a los vendedores por entrada de ubicación de los usuarios y luego ordenar por calificación promedio. ¿Es posible? Este es el fragmento del modelo. El modelo tiene una variedad de críticas.
const sellerSchema = new mongoose.Schema({ _id: Mongoose....ObjectId //... reviews: [ { by: { type: mongoose.Schema.Types.ObjectId, ref: "User", }, title: { type: String, }, message: { type: String, }, rating: Number, imagesUri: [{ String }], timestamp: { type: Date, default: Date.now, }, }, ], });Entonces mi agregado tengo:
const seller = await Seller.aggregate( [ { $geoNear: { near: { type: "Point", coordinates: [longitude, latitude], }, distanceField: "distance", spherical: true, maxDistance: radius, }, }, rating_minimum ? { $match: { rating: { $gt: rating_minimum } } } : {}, {$limit: limit}, ]);Estaba pensando en $group y crear avgReview, y luego ordenarlos por revisiones algo así como:
{$group:{averageReviews: { $avg: "$reviews.rating"}}, {$sort: { averageReviews: 1 } }, {$limit: limit}Dado que las revisiones están ordenadas por documento, en lugar de $group que recopila documentos, puede usar $reduce para calcular la calificación promedio:
{ $addFields: { ratingSum: { $reduce: { initialValue: 0, input: "$reviews", in: {$sum: ["$$value", "$$this.rating"]} } } } }, { $addFields: { "averageReviews": {"$divide": ["$ratingSum", {$size: "$reviews"}] } } }, {$sort: { averageReviews: 1 } }, {$limit: limit}Como puede ver en este ejemplo de patio de recreo.
No estoy seguro de lo que está tratando de limitar para 3, pero si son los resultados finales, 3 vendedores, entonces lo está usando correctamente.
Por cierto, a su esquema de vendedor le falta la ubicación del vendedor, necesaria para $geoNear .