返回其他字段的聚合查询

时间:2016-10-23 09:28:17

标签: mongodb

我的数据看起来像这样。

sortfunc

我需要按{ "badgeId" : "ventura", "date" : ISODate("2016-12-22T21:26:40.382+0000"), "mistakes" : NumberInt(10) } { "_id" : "a4usNGibIu", "badgeId" : "dog", "date" : ISODate("2016-12-21T21:26:40.382+0000"), "mistakes" : NumberInt(10) } { "_id" : ObjectId("580c77801d7723f3f7fe0e77"), "badgeId" : "dog", "date" : ISODate("2016-11-24T21:26:41.382+0000"), "mistakes" : NumberInt(5) } 分组的文档,其中badgeId最小,相应的mistakes

我无法对$ group中的date使用$ min,$ max,$ first,$ last,因为我需要date最低的行date

我在使用mistakes时尝试了以下查询,但它不会提供预期的结果,因为它会选择$min

的$ min
date

2 个答案:

答案 0 :(得分:0)

您可以按mistakes对结果进行排序,然后选择相应的$first mistakesdate

[
  {$sort: {mistakes: 1}},
  {
    $group: { 
      _id: '$badgeId',
      date: {
       $first: '$date'
      },
      mistakes: {
        $first: '$mistakes'
      }
     }
    }

]

答案 1 :(得分:0)

我认为您的查询是正确的,但正如您在此处看到的日期无效。

ISODate(" 2016-14-22T21:26:41.382 + 0000") ISODate(" 2016-13-22T21:26:40.382 + 0000&#34)

在这两个日期中你可以看到月份是13和14,这是无效的月份。以下是放入mongodb后的正确数据。

 {
    "_id" : ObjectId("580ca86c9a43fad551ba801f"),
    "badgeId" : "ventura",
    "date" : ISODate("2016-12-22T21:26:40.382Z"),
    "mistakes" : 10
   }
   {
    "_id" : "a4usNGibIu",
    "badgeId" : "dog",
    "date" : ISODate("2016-12-23T21:26:40.382Z"),
    "mistakes" : 10
  }
  {
    "_id" : ObjectId("580c77801d7723f3f7fe0e77"),
    "badgeId" : "dog",
    "date" : ISODate("2016-12-24T21:26:40.382Z"),
    "mistakes" : 5
 }

应用您的查询时

db.getCollection('COLLECTION_NAME').aggregate([
  {
    $group: { 
      _id: '$badgeId',
      date: {
       $min: '$date'
      },
      mistakes: {
        $min: '$mistakes'
      }
    }
  }
])

我得到了以下结果。

{
    "_id" : "dog",
    "date" : ISODate("2016-12-23T21:26:40.382Z"),
    "mistakes" : 5
}
{
    "_id" : "ventura",
    "date" : ISODate("2016-12-22T21:26:40.382Z"),
    "mistakes" : 10
}