簡體   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