首页 > 解决方案 > 需要获取mongodb上复杂数据的平均值

问题描述

我无法使用 mongoose (nodejs) 在 mongodb 中找到复杂搜索的平均值(我不确定它是否可能)。

所以,我有一个童子军的集合。球探基本上是用户在比赛(夹具)中对球员的投票。侦察项目看起来像这样:

{
    "_id": "6036dbbd148ccf17e82e6f14",
    "player": "60243968d7ec0721344514ab",
    "user": "601e9c826a339228e8f54305",
    "fixture": "602435741f2e4e263492de66",
    "score": 7,
    "text": "Lorem ipsum",
    "likes": 92,
    "createdDate": "2021-02-24T23:05:33.176Z",
    "__v": 0
},
{
    "_id": "6036dbbd148ccf17e82e6f16",
    "player": "60243968d7ec0721344514ab",
    "user": "601e9c826a339228e8f54306",
    "fixture": "602435741f2e4e263492de66",
    "score": 1,
    "text": "Lorem ipsum",
    "likes": 76,
    "createdDate": "2021-02-24T23:05:33.181Z",
    "__v": 0
},

我需要的是:一名球员在比赛中的平均得分(在所有用户中)。这就是我正在尝试的:

  Scout.aggregate([
     { $match: {
        $and: [
          {player: mongoose.Types.ObjectId(req.params.playerId)},
          {fixture: mongoose.Types.ObjectId(req.params.fixtureId)},
        ]}
     },
     { $group: { _id: "$_id", "avgScore": { "$avg": "$score" }}}
   ])

但我得到的结果是这个(这不是预期的结果 - 应该是 4 作为平均值):

{
    "_id": "6036dbbd148ccf17e82e6f16",
    "avgScore": 1
},
{
    "_id": "6036dbbd148ccf17e82e6f14",
    "avgScore": 7
}

]

标签: javascriptnode.jsmongodbmongoose

解决方案


您的聚合没问题,但是您正在重新组合文档,_id而文档总是不同的,所以这样做,

{
 $group: {
  _id: null,
  "avgScore": {
    "$avg": "$score"
  }
 }
}

在这里测试它:https ://mongoplayground.net/p/6Qt8E69Z2d6


推荐阅读