#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. Это нормально, но это работа. как и в моей демонстрации, он работает хорошо. Если у вас есть какие-либо опасения или проблемы с поиском данных, пожалуйста, опубликуйте свои данные, чтобы я мог вам помочь.