如何在 mongodb 中获取数组的平均属性(猫鼬)
How to get average an attribute of an array in mongodb (mongoose)
请帮助我,我正在尝试通过用户位置输入接近卖家,然后按平均评分排序。可能吗?
这是模型的片段。模型有一系列评论。
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,
},
},
],
});
那么我的总数是:
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},
]);
我在考虑 $group 并创建 avgReview,然后按类似这样的评论对它们进行排序:
{$group:{averageReviews: { $avg: "$reviews.rating"}},
{$sort: { averageReviews: 1 } },
{$limit: limit}
由于评论是按文档排列的,而不是 $group
收集文档,您可以使用 $reduce
来计算平均评分:
{
$addFields: {
ratingSum: {
$reduce: {
initialValue: 0,
input: "$reviews",
in: {$sum: ["$$value", "$$this.rating"]}
}
}
}
},
{
$addFields: {
"averageReviews": {"$divide": ["$ratingSum", {$size: "$reviews"}]
}
}
},
{$sort: { averageReviews: 1 } },
{$limit: limit}
正如您在 this playground example 上看到的那样。
我不确定你试图限制 3 个,但如果是最终结果,3 个卖家,那么你使用它是正确的。
顺便说一句,您的卖家架构缺少 $geoNear
所需的卖家位置。
请帮助我,我正在尝试通过用户位置输入接近卖家,然后按平均评分排序。可能吗? 这是模型的片段。模型有一系列评论。
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,
},
},
],
});
那么我的总数是:
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},
]);
我在考虑 $group 并创建 avgReview,然后按类似这样的评论对它们进行排序:
{$group:{averageReviews: { $avg: "$reviews.rating"}},
{$sort: { averageReviews: 1 } },
{$limit: limit}
由于评论是按文档排列的,而不是 $group
收集文档,您可以使用 $reduce
来计算平均评分:
{
$addFields: {
ratingSum: {
$reduce: {
initialValue: 0,
input: "$reviews",
in: {$sum: ["$$value", "$$this.rating"]}
}
}
}
},
{
$addFields: {
"averageReviews": {"$divide": ["$ratingSum", {$size: "$reviews"}]
}
}
},
{$sort: { averageReviews: 1 } },
{$limit: limit}
正如您在 this playground example 上看到的那样。
我不确定你试图限制 3 个,但如果是最终结果,3 个卖家,那么你使用它是正确的。
顺便说一句,您的卖家架构缺少 $geoNear
所需的卖家位置。