MongoDB 的 30 天统计数据

朱利叶斯·毛瑟

我目前正在尝试使用 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 矿石的根文档中插入排名或点字段吗?我应该始终为此运行聚合吗?帮我的坦克

安德拉尼卡斯尔

你可以试试这样的

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"
            }
        }
    }
])

我希望这能帮到您。如果您有任何问题,请随时提出。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章