繁体   English   中英

使用流星中的mongo聚合来总计解锁/锁定的集合

[英]Using mongo aggregate in meteor to total unlocked/locked in collection

因此,我有一个集合可以存储与用户相关的文档,其结构如下:

{_id: "hofjew233332j4", userId: "fhewojfw34324", achievementUnlocked: true };

我想做的是使用聚合和下划线来按用户ID对文档进行分组,然后计算将其未锁定记录的百分比设置为true,这样生成的文档将如下所示:

{_id: "fhewojfw34324(userId)", unlockPercentage: 40 (achievementUnlocked: true / all docs) }

我可以只检索一次文档就能做到吗?

第一组按计数achievementUnlocked true计数,然后在项目中使用以下计数来计算percentage ,方法如下:

db.collectionName.aggregate([{
    "$group": {
        "_id": "$userId",
        "achievementUnlockedTrueCount": {
            "$sum": {
                "$cond": {
                    "if": {
                        "$eq": ["$achievementUnlocked", true] //count achievementUnlocked = true count 
                    },
                    "then": 1,
                    "else": 0
                }
            }
        },
        "totalCount": {
            "$sum": 1 // get total count of grouped documents 
        }
    }
}, {
    "$project": {
        "unlockPercentage": {
            "$multiply": [{
                "$divide": ["$achievementUnlockedTrueCount", "$totalCount"] //used this in project to caculate %
            }, 100]
        }
    }
}]).pretty()

我个人甚至不会在这里进行汇总,因为数据似乎微不足道。 维护每个用户和/或“游戏”数据的一系列“锁定”和“解锁”成就将更为有效。

取得像这样的文件:

{
    "_id": "hofjew233332j4", 
    "userId": "fhewojfw34324",
    "gameId": "v3XWHHvFSHwYxxk6H",
    "achievementsCount": 5,
    "locked": ["One","Two","Four","Five"],
    "lockedCount": 4,
    "unlocked": ["Three"]
    "unlockedCount": 1
}

因此,您通常会使用所有“锁定”的成就在此处初始化每个用户和“游戏”,但是在这种情况下,我们将显示“解锁”中已经存在的成就。 另请注意,“ count”字段反映每个阵列中存在的条目数。

要“解锁”另一项成就,则只需执行更新以从“锁定”数组中删除并插入到“解锁”数组中,同时保持“计数”值不变:

Achievements.update(
   { 
       "userId": "fhewojfw34324",
       "gameId": "v3XWHHvFSHwYxxk6H",
       "locked": "Four",
       "unlocked": { "$ne": "Four" }
   },
   {
       "$push": { "unlocked": "Four" },
       "$pull": { "locked": "Four" },
       "$inc": {
           "lockedCount": -1,
           "unlockedCount": 1
       }
   }
)

这会将文档更改为以下状态:

{
    "_id": "hofjew233332j4", 
    "userId": "fhewojfw34324",
    "gameId": "v3XWHHvFSHwYxxk6H",
    "achievementsCount": 5,
    "locked": ["One","Two","Five"],
    "lockedCount": 3,
    "unlocked": ["Three","Four"]
    "unlockedCount": 2
}

这是一个非常简单的模式,因为每次更新都会维护正确的值和数据。 如果您需要诸如“百分比”之类的信息,那么这很简单:

Achievements.aggregate([
    { "$project": {
        "userId": 1,
        "gameId": 1,
        "percentUnlocked": { "$divide": [ "$unlockedCount", "$achivementsCount" ] }
])

或者只是将数学应用到客户端代码中。

该模型还使您可能希望做的“真实”聚合要简单得多,并且具有更大的信息范围。 另外,进行计算的效率要比要求将数据“累加”为一个单独的过程要有效得多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM