MongoDB查询内嵌数组的统计值

在游戏数据中,一个玩家数据的doucument可能包含一些数据,如背包道具,我们要统计数据库中某道具ID的数量。

原始数据:

{
    "_id":"3915",
    "createTime":1574954810000,
    "platform":"Android",
    "bag": [
        {
            "id":1,
            "name":"道具1",
            "num":3
        },
        {
            "id":2,
            "name":"道具2",
            "num":9
        },
        {
            "id":3,
            "name":"道具3",
            "num":5
        }
    ]
}

{
    "_id":"1234",
   "createTime":1574954820000,
   "platform":"iOS",
    "bag": [
        {
            "id":1,
            "name":"道具1",
            "num":1
        },
        {
            "id":3,
            "name":"道具3",
            "num":5
        }
    ]
}

现在需要按平台(platform)统计创建时间(createTime)大于1574954800000,道具ID为3的数量.

db.getCollection("PlayerData").aggregate([
    {
        $unwind: "$bag"
    },
    {
        $match: {
            "createTime": {
                $gt: 1574954800000
            },
            "bag.id": 3
        }
    },
    {
        $group: {
            _id: "$platform",
            num: {
                $sum: "$bag.num"
            }
        }
    }
])

  • $unwind: 将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
  • $match : 用于过滤数据,只输出符合条件的文档。match使用MongoDB的标准查询操作。
  • $group: 将集合中的文档分组,可用于统计结果。
0%