sql >> データベース >  >> NoSQL >> MongoDB

価値が発生するまでの以前のレコードの集計のようなMongoDBランニングトータル

    この集計を試してください

    1. $match -gameIdでフィルタリング
    2. $sort -タイムスタンプでドキュメントを並べ替える
    3. $group -配列に一致するものをすべて累積します
    4. $addFields -$reduce キルを計算し、フィルタリングしてキルをドキュメントにマッピングします
    5. $unwind -元のドキュメント構造を取得するためのフラット配列
    6. $replaceRoot -元の構造のようにデータをトップレベルに移動します

    パイプライン

    db.games.aggregate([
        {$match : {gameId : 1}},
        {$sort : {timestamp : 1}},
        {$group : {_id : "$gameId", data : {$push : "$$ROOT"}}},
        {$addFields : {data : {
            $reduce : {
                input : "$data",
                initialValue : {kills : [], data : [], count : 0},
                in : {
                    count : {$sum : ["$$value.count", {$cond : [{$eq : ["$$this.type", "ENEMY_KILLED"]}, 1, 0]}]},
                    data : { $concatArrays : [
                         "$$value.data", 
                         {$cond : [
                                {$ne : ["$$this.type", "ENEMY_KILLED"]}, 
                                [
                                    {
                                        _id : "$$this._id",
                                        gameId : "$$this.gameId",
                                        participantId : "$$this.participantId",
                                        type : "$$this.type",
                                        timestamp : "$$this.timestamp",
                                        kills : {$sum : ["$$value.count", {$cond : [{$eq : ["$$this.type", "ENEMY_KILLED"]}, 1, 0]}]}
                                    }
                                ],
                                []
                            ]}
                        ]}
                    }
                }}
        }},
        {$unwind : "$data.data"},
        {$replaceRoot : {newRoot : "$data.data"}}
    ]).pretty()
    

    コレクション

    > db.games.find()
    { "_id" : 1, "gameId" : 1, "participantId" : 3, "type" : "ITEM_PURCHASED", "timestamp" : 656664 }
    { "_id" : 2, "gameId" : 1, "participantId" : 3, "victimId" : 9, "type" : "ENEMY_KILLED", "timestamp" : 745245 }
    { "_id" : 3, "gameId" : 1, "participantId" : 3, "victimId" : 7, "type" : "ENEMY_KILLED", "timestamp" : 746223 }
    { "_id" : 4, "gameId" : 1, "participantId" : 3, "type" : "ITEM_PURCHASED", "timestamp" : 840245 }
    

    結果

    {
        "_id" : 1,
        "gameId" : 1,
        "participantId" : 3,
        "type" : "ITEM_PURCHASED",
        "timestamp" : 656664,
        "kills" : 0
    }
    {
        "_id" : 4,
        "gameId" : 1,
        "participantId" : 3,
        "type" : "ITEM_PURCHASED",
        "timestamp" : 840245,
        "kills" : 2
    }
    > 
    



    1. 過去24時間に作成された投稿の日付に関するクエリ

    2. NoSQL(MongoDB)でのコミットとディスクの永続性

    3. MongoDB $ toDecimal

    4. mongodbのオブジェクトの配列を検索する方法