Запрос агрегации, который возвращает другие поля

#mongodb

#mongodb

Вопрос:

У меня есть данные, которые выглядят следующим образом.

 { 
    "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 наименьшее и соответствующее date

Я не могу использовать $ min, $ max, $ first, $ last для date в $ group, потому что мне нужно date из строки, где mistakes значение наименьшее.

Я попробовал следующий запрос, который я использую $min , но он не даст желаемого результата, поскольку он выберет $ min из date

 db.Badges.aggregate([
  {
    $match: otherMatchConditions
  },
  {
    $group: { 
      _id: '$badgeId',
      date: {
       $min: '$date'
      },
      mistakes: {
        $min: '$mistakes'
      }
    }
  }
])
  

Ответ №1:

Вы можете отсортировать результаты по mistakes , а затем взять соответствующее $first из mistakes и date

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

]
  

Ответ №2:

Я думаю, что ваш запрос правильный, но, как вы видите, даты здесь недопустимы.

ISODate («2016-14-22T21:26:41.382 0000») и ISODate(«2016-13-22T21:26:40.382 0000»),

в обеих датах вы можете видеть месяцы 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
}
  

Комментарии:

1. извините, это был ручной пример кода только для вопроса.

2. Это нормально, но это работа. как и в моей демонстрации, он работает хорошо. Если у вас есть какие-либо опасения или проблемы с поиском данных, пожалуйста, опубликуйте свои данные, чтобы я мог вам помочь.