How to calculate the percentage using facet in MongoDB?

瘦欲@ 提交于 2021-01-28 21:31:31

问题


I am calculating the notification percentage in my app for tracking some statistics.

My Collection:

[
  {
    _id: "123",
    status: "seen",
    userId: "589"
  },
  {
    _id: "223",
    status: "seen",
    userId: "589"
  },
  {
    _id: "474",
    status: "unseen",
    userId: "589"
  },
  {
    _id: "875",
    status: "seen",
    userId: "112"
  },
  {
    _id: "891",
    status: "unseen",
    userId: "112"
  }
]

Expected Result:

Here we can see that, UserId - 589 has received 3 notifications out of which 2 are seen. So the calculation is (totalNumOfSeen/totalNumOfNoticationsSent) * 100

[{
    userId: "589",
    notificationPercentage : 66.66
},{
    userId: "112",
    notificationPercentage : 50
}]

I am using a facet for grouping and matching but that is returning me an array of object and I am not getting how to perform divide on this.

My Query:

db.collection.aggregate([
  {
    $facet: {
      totalNumOfSeen: [
        {
          $match: {
            userId: "589",
            status: "seen"
          }
        },
        {
          $group: {
            _id: "$userId",
            totalNumOfSeen: {
              $sum: 1
            }
          }
        }
      ],
      totalNumOfNoticationsSent: [
        {
          $match: {
            userId: "589",
            
          }
        },
        {
          $group: {
            _id: "$userId",
            totalNumOfNoticationsSent: {
              $sum: 1
            }
          }
        }
      ]
    }
  }
])

The Above Query is giving me the below Result:

[
  {
    "totalNumOfNoticationsSent": [
      {
        "_id": "589",
        "totalNumOfNoticationsSent": 3
      }
    ],
    "totalNumOfSeen": [
      {
        "_id": "589",
        "totalNumOfSeen": 2
      }
    ]
  }
]

MongoPlayground - https://mongoplayground.net/p/jHn2ZlshgDL

Now I need to add one more field as notificationPercentage and calculate the notification percentage based on the above facet result. Really appreciate the help.


回答1:


You can try,

  • $group by userId and get totalSeen count using $cond if status is seen, get total count of notification using $sum,
  • $project to show required fields, and calculate percentage using $divide and $multiply
db.collection.aggregate([
  {
    $group: {
      _id: "$userId",
      totalSeen: {
        $sum: { $cond: [{ $eq: ["$status", "seen"] }, 1, 0] }
      },
      total: { $sum: 1 }
    }
  },
  {
    $project: {
      _id: 0,
      userId: "$_id",
      notificationPercentage: {
        $multiply: [{ $divide: ["$totalSeen", "$total"] }, 100]
      }
    }
  }
])

Playground



来源:https://stackoverflow.com/questions/64852459/how-to-calculate-the-percentage-using-facet-in-mongodb

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!