如何在 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 所需的卖家位置。