将结果发送回MongoDB之前的数据处理

将结果发送回MongoDB之前的数据处理,mongodb,aggregation-framework,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 } 在查询数据时,我们将发送%作为计算的权重。因此,假设我们发送30%用于评级,30%用于审查,20%用于收入和授权sed 现在我们需要根据下面的计算对每条记录进行评分 Sc

我们需要根据定义的算法对记录进行排序。我们的MongoDB中有4个字段,如下所示:

{
"rating" : 3.5
"review" : 4
"revenue" : 100
"used" : 3.9
},
{
"rating" : 1.5
"review" : 2
"revenue" : 10
"used" : 2.1
}
在查询数据时,我们将发送%作为计算的权重。因此,假设我们发送30%用于评级,30%用于审查,20%用于收入和授权sed

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

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

for rating = (3.5 - 2.5) /1 * 30% = .03
所以我们需要计算每个列(或字段)的分数,然后所有4个字段的总和将为每个记录打分

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


提前感谢

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
            ]
          }
        }
      }
    }
  }
])

每列得分=(现有值-平均值(列)/标准差)*%weightage
如何计算?这些字段是什么?\(3.5-2.5)/1*30%->这应该等于0.3,对吗?或者我遗漏了什么?我在评级中也有空值,运行上面的查询会为所有内容提供空值。只需添加一个匹配阶段删除空值,相应地对答案进行更改,然后检查它。