在MongoDB中发送结果之前的数据处理

jvm*_*jvm 5 mongodb aggregation-framework

我们需要根据一些定义的算法对记录进行排名.我们的MongoDB中有4个字段如下;

{
"rating" : 3.5
"review" : 4
"revenue" : 100
"used" : 3.9
},
{
"rating" : 1.5
"review" : 2
"revenue" : 10
"used" : 2.1
}
Run Code Online (Sandbox Code Playgroud)

在查询数据时,我们将发送%作为计算的权重.因此,假设我们发送30%的评级,30%的评论和20%的收入和ud sed.

现在我们需要根据以下计算对每条记录进行评分.

Score per column = (Existing Value - Average(Column) / StandardDeviation) * %weightage

for rating = (3.5 - 2.5) /1 * 30% = .03
Run Code Online (Sandbox Code Playgroud)

因此,我们需要计算每列(或字段)的得分,并且所有4个字段的总数将为每个记录提供得分.

是否可以使用任何MongoDB内置函数进行此类计算?

提前致谢

Elv*_*vis 0

Mongo 有默认的运算符来查找标准差 ($stdDevPop) 和查找平均值 ($avg),显然还有减法、乘法和除法。

因此,使用所有这些运算符,您绝对可以根据需要编写聚合。

我已经在下面完成了评级,您可以对其他字段使用相同的逻辑。

另外,将 0.3 替换为您的权重百分比。

db.collection.aggregate([
{
    $match: {
      rating: {
        $ne: null
      }
    }
  },
  {
    $group: {
      _id: null,
      ratings: {
        $push: "$rating"
      },
      avg_rating: {
        $avg: "$rating"
      },
      std_deviation_rating: {
        $stdDevPop: "$rating"
      }
    }
  },
  {
    $project: {
      ratings: {
        $map: {
          input: "$ratings",
          as: "rating",
          in: {
            $multiply: [
              {
                $divide: [
                  {
                    $subtract: [
                      "$$rating",
                      "$avg_rating"
                    ]
                  },
                  "$std_deviation_rating"
                ]
              },
              0.3
            ]
          }
        }
      }
    }
  }
])
Run Code Online (Sandbox Code Playgroud)