0

計數這是一出在我的數據庫中約10萬行的:集團通過對陣列的MongoDB

{ 
    "_id" : ObjectId("58f569159f809c49ffc5cdbb"), 
    "date" : ISODate("2017-03-21T09:10:07.686Z"), 
    "p1" : { 
     "_id" : 1765906, 
     "deck" : [ 
      33, 
      25, 
      59, 
      38, 
      62, 
      3, 
      33, 
      57 
     ], 
     "crowns" : 3 
    }, 
    "p2" : { 
     "_id" : 2520156, 
     "deck" : [ 
      25, 
      69, 
      86, 
      8, 
      44, 
      61, 
      69, 
      50 
     ], 
     "crowns" : 2 
    } 
} 

這是一個記錄的遊戲的戰鬥。甲板是由8張不同牌組成的陣列。我試圖找到贏得最多的牌。贏家可以通過比較冠來決定(我設法選擇所有贏家1的文件)。

我想實現:

  1. 遺憾的是我沒能執行組查詢這將返回我所期待的(最勝卡)。

  2. 我也試圖找到最成功的套牌(贏的數量就夠了 - 該數組中指定的牌的順序應該被忽略)。

我都試過了,但一段時間後返回一個空的錯誤:

db.battle_logs.aggregate([ 
    { 
     $addFields: { 
      "player1won": { "$cmp": [ "$p1.crowns", "$p2.crowns" ] } 
     } 
    }, 
    { $match: { "player1won": 1 }}, 
    { 
     $group: 
     { 
      _id: "$p1.deck", 
      count: { $sum: 1 } 
     } 
    } 
], { 
    allowDiskUse:true, 
    cursor:{} 
}) 

我有望獲得其獲勝的數量(僅PLAYER1勝認爲)

分組的所有甲板組合
+0

它不是很清楚,你可以添加預期輸出的文檔你提供了嗎? – felix

+0

@felix對於2)它將是甲板(這是一個由int組成的數組),其數量/勝數(我已經在給定查詢中爲player1Won過濾了,所以我只需要按甲板分組並計數這是結果)。我假設我需要對int數組(p1.deck)進行排序,以便它忽略卡片的順序 – kentor

回答

0

由於您在組查詢中使用數組p1.deck作爲_id,您需要對數組進行排序,否則卡的順序將創建一個新組。

這裏是一個東西,可能你的情況下工作:

1)

db.battle_logs.aggregate([ 
    { 
     $addFields: { 
      "player1won": { "$cmp": [ "$p1.crowns", "$p2.crowns" ] } 
     } 
    }, 
    //Fiter out ties 
    { 
     $match: { 
      "$or" : [ 
       {"player1won": 1}, //Player 1 won 
       {"player1won" : -1} //Player 2 won 
      ] 
     } 
    }, 
    // Get the winning deck 
    { 
     $project: { 
      "deck": { $cond : [ { $gte : [ "$p1.crowns", "$p2.crowns" ]}, "$p1.deck", "$p2.deck" ]} 
     } 
    }, 
    //Unwind the deck to get every card 
    { 
     $unwind : "$deck" 
    }, 
    //Get count of each card 
    { 
     $group : { 
      "_id" : "$deck" , 
      "count" : {"$sum" : 1} 
     } 
    }, 
    // Sort on count 
    { 
     $sort: {"count" : -1} 

    }, 
    //Get the card with highest count 
    { 
     $limit: 1 
    } 
], { 
    allowDiskUse:true, 
    cursor:{} 
}) 

2)

db.battle_logs.aggregate([ 
    { 
     $addFields: { 
      "player1won": { "$cmp": [ "$p1.crowns", "$p2.crowns" ] } 
     } 
    }, 
    //Fiter out ties 
    { 
     $match: { 
      "$or" : [ 
       {"player1won": 1}, //Player 1 won 
       {"player1won" : -1} //Player 2 won 
      ] 
     } 
    }, 
    // Get the winning deck 
    { 
     $project: { 
      "deck": { $cond : [ { $gte : [ "$p1.crowns", "$p2.crowns" ]}, "$p1.deck", "$p2.deck" ]} 
     } 
    }, 
    //Unwind the deck to get every card 
    { 
     $unwind : "$deck" 
    }, 
    //Sort the cards 
    { 
     $sort : {"deck": 1} 
    }, 
    //Group sorted cards back in deck 
    { 
     $group : { 
      "_id" : "$_id" , 
      "deck" : {"$push" : "$deck"} 
     } 
    }, 
    { 
     $group: 
     { 
      _id: "$deck", 
      count: { $sum: 1 } 
     } 
    } 
], { 
    allowDiskUse:true, 
    cursor:{} 
})