[英]How to get embedded document in an array in MongoDB (with Mongoose)
[英]How to get average an attribute of an array in mongodb (mongoose)
請幫助我,我正在嘗試通過用戶位置輸入來接近賣家,然后按平均評分排序。 是否可以? 這是 model 的片段。Model 有一系列評論。
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}
正如您在這個游樂場示例中看到的那樣。
我不確定你試圖限制 3 個,但如果它是最終結果,3 個賣家,那么你使用它是正確的。
順便說一句,您的賣家架構缺少$geoNear
所需的賣家位置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.