簡體   English   中英

如何在 mongodb (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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM