0

こんにちは、ゲームの記録が 2 つあります。

プレイヤーのリストを持つゲーム 1 p1( alice )、p2( bob )、p3( matt )、p4( tom )

プレーヤーのリストを含むゲーム 2 p1( alice )、p2( bob )、p3( jack )、p4( tom )

MongoDB コレクション ゲームにクエリを実行して、同じゲームにBOBとして登場する最も頻繁に登場する人物を並べ替えたいと考えています。この場合の良い結果は次のようになります。

Alice: appear 2 times
Tom:  appear 2 time
Matt: appear 1 time
Jack: appear 1 time

SQLで私がした:

             SELECT idplayer, COUNT(idplayer) AS countplayer 
             FROM (SELECT b.idgame, b.idplayer 
             FROM associations a, associations b 
             WHERE a.idplayer="BOB" 
             AND b.idgame=a.idgame 
             AND b.idplayer <> "BOB"
             ORDER BY b.idgame DESC LIMIT 1000) as c
             GROUP BY idplayer 
             ORDER BY countplayer DESC LIMIT 5;

mongoで私は次のようなことを試みています:

gamesCollection.find("{playerid : #}","BOB").sort(//counter).limit(5)...

MongoDB のこのクエリを修正するのを手伝ってくれる人はいますか? ありがとうございました

編集:

私は自分が望むものに近づいていると思いますが、それでも間違ったクエリです:

> db.games.aggregate("[{ $match: {playerid : 'bob'} }, {$group : { _id:null, cou
nt: { $sum: 1}} } ]")

解決策を提案してください。ありがとう

編集2

ゲーム ドキュメントの例:

{ "_id" : ObjectId("514d9afb6e058b8a806bdbc0"), "gameid" : 1, "numofplayers" : 3,
 "playersList" : [{"playerid" : "matt" },{"playerid" : "bob"},{"playerid" : "alice"} ] }
4

1 に答える 1

1

元のドキュメントが次のようになっている場合:

{
   _id: ObjectId(...),
   players: [...]
}

次に、次を使用してそれを行うことができますaggregate

var playerId = 'bob';
db.records.aggregate([
  { $match: { players: playerId }},
  { $unwind: '$players' },
  { $match: { players:  { $ne: playerId } } },
  { $group: { _id: { player: '$players' }, times: { $sum : 1} } },
  { $sort: { times: -1 } }
])

更新:

ドキュメントの場合:

{ 
  "_id" : ObjectId("514d9afb6e058b8a806bdbc0"), 
  "gameid" : 1, "numofplayers" : 3,
  "playersList" : [
    {"playerid" : "matt" },
    {"playerid" : "bob"},
    {"playerid" : "alice"} 
   ] 
}

クエリは次のとおりです。

var playerId = 'bob';
db.records.aggregate([
  { $match: { 'playersList.playerid': playerId }},
  { $unwind: '$playersList' },
  { $match: { 'playersList.playerid':  { $ne: playerId } } },
  { $group: { _id: '$playersList.playerid', times: { $sum : 1} } },
  { $sort: { times: -1 } }
])

$group// また、演算子がより単純になる可能性があることもわかりました

于 2013-03-23T12:15:18.457 に答える