次のMongoDB
コレクション " Games
" があります:
{
"_id" : ObjectId("515461d3c6c18efd4a811fd3"),
"gameid" : NumberLong("86982207656"),
"tableName" : "Hydra Zoom 40-100 bb",
"nplayers" : 6,
"playersList" : [
{ "exist" : true,
"suspended" : false,
"grade" : 0,
"clusterId" : -1,
"playerid" : "DoomY9999",
"playsWithFriends" : 0,
"squeezePlay" : 0,
"weakShowdown" : 0,
"numberOfPlays" : 1
},
{
"exist": true,
"suspended" : false,
次のMySQLクエリを MongoDBにマップしたいと思います
String query = "SELECT idplayer, COUNT(idplayer) AS countplayer "
+ "FROM (SELECT b.idgame, b.idplayer "
+ "FROM associations a, associations b "
+ "WHERE a.idplayer=? "
+ "AND b.idgame=a.idgame "
+ "AND b.idplayer <> ? "
+ "ORDER BY b.idgame DESC LIMIT 1000) as c"
+ " GROUP BY idplayer "
+ "ORDER BY countplayer DESC LIMIT 5;";
クエリの説明: この SQL クエリは、プレイヤー 'X' の同じゲームを最も頻繁にプレイしていると思われるプレイヤーをカウントします。結果は、プレイヤーの名前と一緒にプレイした回数になります
LIMIT についての簡単な注意: 最初の " LIMIT 1000
" は、実際には調査したいゲームの制限になります。データベースが非常に大きくなる可能性があるため、最後の 1000 ゲームのみを DESC 順に分析します (最新のものは " gameid
" が高くなります)。
2 番目の制限 5: は、「上位 5」人のフレンド用です。それらの数を合計します。
これまでのところ、Aggregation Framework のほとんどすべてが"ORDER BY b.idgame DESC LIMIT 1000) as c"
. 通過するゲームの数が非常に多い可能性があるため、これは私にとって重要です。
これがMongoDB(Javaドライバー) での私のクエリです:
//build the query
DBObject match1 = new BasicDBObject("$match", new BasicDBObject("playersList.playerid",_playerid));
DBObject unwind = new BasicDBObject("$unwind", "$playersList");
DBObject match2 = new BasicDBObject("$match", new BasicDBObject("playersList.playerid",new BasicDBObject("$ne",_playerid)));
DBObject groupFields = new BasicDBObject("_id","$playersList.playerid");
groupFields.put("times", new BasicDBObject("$sum",1));
DBObject group = new BasicDBObject("$group", groupFields);
DBObject sort = new BasicDBObject("$sort", new BasicDBObject("times",-1) );
DBObject limit = new BasicDBObject("$limit", 5 );
DBObject group2 = new BasicDBObject("$group", "gameid");
DBObject sort2 = new BasicDBObject("$sort", new BasicDBObject("gameid",-1) );
DBObject limit2 = new BasicDBObject("$limit", 1000 );
DB db = mongoDb;
DBCollection coll = db.getCollection("games");
//aggregation query
//THIS WORKS
AggregationOutput output = coll.aggregate( match1, unwind, match2, group, sort, limit);
//THIS DOESN'T WORK!
AggregationOutput output = coll.aggregate( match1, unwind, match2, group, sort, limit, group2, sort2, limit2);
このクエリを修正するのを手伝ってください。ありがとう!