【问题标题】:MongoDB query sort countMongoDB查询排序计数
【发布时间】:2013-03-13 05:17:56
【问题描述】:

您好,我有 2 条游戏记录:

game 1 有玩家列表 p1(alice), p2(bob), p3(ma​​tt >), p4(tom)

game 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"} ] }

【问题讨论】:

标签: mongodb bson


【解决方案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 操作符可以更简单

【讨论】:

  • 嗨,我不知道如何用适合我文档的值替换“...{ _id: { player: '$players' }...”中的“玩家”。游戏如下所示: { "_id" : ObjectId("514d9afb6e058b8a806bdbc0"), "gameid" : 1, "numofplayers" : 3, "playersList" : [{"playerid" : "matt" },{"playerid" : "bob"},{"playerid" : "alice"} ] } 希望你能帮助我。谢谢
  • 非常感谢,这真的很有帮助
猜你喜欢
  • 1970-01-01
  • 2013-09-02
  • 1970-01-01
  • 2015-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-17
  • 1970-01-01
相关资源
最近更新 更多