0

我的 mongoDB 集合中有以下文档。

{
  "_id" : ObjectId("51d90c3746503d6ab5933b88"),
  "scorearray" : [
    {
      "score" : 0.0
    }, 
    {
      "score" : 7.0
    }
    ],
    "player" : "Arod"
}

/* 1 */
{
  "_id" : ObjectId("51d90c0d46503d6ab5933b86"),
  "scorearray" : [
  {
      "score" : 2.0
  }, 
  {
      "score" : 1.0
  }, 
  {
      "score" : 5.0
  }],
  "player" : "Martini"
}

我试图获得每个玩家的最高分数,我有一个如下查询,但它只给了我一个玩家,即 Arod 7.0,我的查询结果中需要 Arod 7.0 和 Martini 5.0。

有人可以指导我如何修改以下查询。任何指导将不胜感激。

db.playerscorecollection.aggregate([
    {$project:{_id:0,player:1, "scorearray.score":1}},
    {$unwind:"$scorearray"},
    {$sort:{"scorearray.score":-1}},
    {$limit:1}
]); 
4

2 回答 2

2

您可以在聚合中使用 $max 运算符:

db.playerscorecollection.aggregate([
 { $unwind: "$scorearray"},
 { $group: { _id: "$player", maxScore: { $max: "$scorearray.score" } } }
])

----- 对于您的第二个问题,要为每个玩家找到最高得分和最高得分发生的地点:

db.playerscorecollection.aggregate(
      { $unwind: "$scorearray"},
      { $group: { _id: { player: "$player", venue: "$scorearray.venue", score: "$scorearray.score" } } },
      { $sort: { "_id.score" : 1 } },
      { $group: { _id: "$_id.player", maxScore: { $last: "$_id.score" }, venue: { $last: "$_id.venue"} } }
)
于 2013-07-08T18:18:30.357 回答
0

感谢您提出第二个问题,我使用以下更简单的方法实现了它。

现在我需要指导将其转换为使用 Java DB 驱动程序检索数据的 Java 程序。任何指导将不胜感激。

db.playerscorecollection.aggregate([ 
{ $unwind: "$scorearray"}, 
{ $group: { _id: {player:'$player,venue:'$venue'}, 
maxScore: { $max: "$scorearray.score" } } } ]); 
于 2013-07-10T05:32:56.320 回答