我目前正在尝试使用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矿石中将排名或得分字段插入根文档中吗,我是否应该为此始终进行汇总?帮我的坦克
答案 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"
}
}
}
])
我希望这会对您有所帮助。 如果您有任何疑问,请随时提问。