MongoDB的30天统计

时间:2018-10-26 14:11:28

标签: database mongodb aggregation-framework

我目前正在尝试使用mongodb创建一个排名系统,我的统计信息条目将被识别30天,然后将其删除,我在此有3个问题,第一个问题,我该如何计算所有的统计数据最近30天一起进行汇总操作?

这是我的数据结构:

{
"_id" : ObjectId("5bd28682a353f11bb30ab9fe"),
"UUID" : "d98e8f70-314f-4858-ad43-7775b2564e38",
"rank" : -1,
"stats" : [ 
    { 
        "timestamp": 1198334588378,
        "stat_kills" : 1.0,
        "stat_deaths": 4.0,
        "points" : 10
    }, 
    {
        "timestamp": 1198334588378,
        "stat_kills" : 8.0,
        "stat_deaths": 1.0,
        "points" : 26
    }, 
    {
        "timestamp": 1198334588378,
        "stat_kills" : 5.0,
        "stat_deaths": 6.0,
        "points" : 4
    }, 
    {
        "timestamp": 1198334588378,
        "stat_items_pickedup" : 8.0,
        "stat_kills" : 7.0,
        "stat_deaths": 3.0,
        "points" : 34
    }
]
}

我有一个聚合查询,它计算所有点,它看起来像这样:

db.test.aggregate(
[
    {
        $match: {
            "UUID" : "d98e8f70-314f-4858-ad43-7775b2564e38"
        }
    },
    {
        $unwind: {
            path : "$stats"
        }
    },
    {
        $group: {
            _id:"$UUID", points: {$sum : "$stats.points"}
        }
    },

]
);

当前结果是:

  {"_id" : "d98e8f70-314f-4858-ad43-7775b2564e38", "points" : 74}

所需的结果是:

{
"UUID":"d98e8f70-314f-4858-ad43-7775b2564e38", 
"points":74,
"stat_kills":(sum of all kills),
"stat_death" : (sum of all deaths),
"stat_items_pickedup": (sum of all items picked up)
}

问题是我不知道要累加的所有字段,它们总是不同的,它们可能是10个字段,但也可能是2个或只有1个stats字段,有没有一种汇总方法来实现这一点?数据库结构不是最终的,因此如果需要更改,我可以采用更改,我的第二个问题是如何删除早于30天的列表条目,时间戳为java system.currenttimemilis,因此我可以运行在Java客户端上进行聚合搜索,但是如何删除聚合的列表条目?我那里没有代码,因为我不知道如何执行此操作,3d问题是如何根据他的所有要点获得给定文档的排名?他拥有的得分越高,他获得的排名就越好,那么,我可以在uuid矿石中将排名或得分字段插入根文档中吗,我是否应该为此始终进行汇总?帮我的坦克

1 个答案:

答案 0 :(得分:0)

您可以尝试这样的事情

db.collectionName.aggregate([
    {
        $unwind: {
            path : "$stats"
        }
    },
    {
        $match: {
            "stats.timestamp": {
                $gte: (Math.round(new Date().getTime()) - 86400000*30)
            }
        }
    },
    {
        $group: {
            _id: "$UUID",
            stat_kills: {
                $sum: "$stats.stat_kills"
            },
            stat_deaths: {
                $sum: "$stats.stat_deaths"
            },
            points: {
                $sum: "$stats.points"
            },
            "rank": {
                $first: "$rank"
            }
        }
    }
])

我希望这会对您有所帮助。 如果您有任何疑问,请随时提问。