Как получить самую раннюю запись по дате для уникального ограничения? - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть коллекция с двумя полями, которые важны для этого вопроса: категория и дата (для простоты я просто буду использовать «вчера» и «сегодня»).

// Sample Data
{ category: 1, date: ISODate("yesterday") } 
{ category: 1, date: ISODate("today") }
{ category: 2, date: ISODate("yesterday") } 
{ category: 2, date: ISODate("today") }
{ category: 3, date: ISODate("yesterday") } 

Теперь я модифицирую запрос, который будет сначала запрашивать категорию, затем сортироваться по убыванию даты и ограничиваться 1 результатом (предоставляя мне самую раннюю запись по дате для отдельной категории.

db.collection("things").find({ category: 1 }).sort({ date: -1 }).limit(1)

// Result
{ category: 1, date: ISODate("today") }

Это сработало отлично. Тем не менее, я хочу самую раннюю запись для КАЖДОЙ категории. Это означает, что я не могу использовать оператор предела (потому что я не знаю, сколько категорий существует в любой данный момент времени), и я не гарантирую, что дата будет записана для каждого дня в каждой категории.

// Expected Result
{ category: 1, date: ISODate("today") }
{ category: 2, date: ISODate("today") }
{ category: 3, date: ISODate("yesterday") } 

Я играл отчетливо, но безуспешно.

Как я могу получить запись с самой ранней датой для каждой категории в одном запросе?

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Вы можете попробовать ниже агрегации

Вы можете сначала $sort с date, затем $group и возьмите документ $first с полем date.

db.collection.aggregate([
  { "$sort": { "date": 1 } },
  { "$group": {
    "_id": "$category",
    "date": { "$first": "$date" }
  }},
  { "$project": { "_id": 0, "category": "$_id", "date": 1 }}
])
0 голосов
/ 11 сентября 2018

Вы можете $group по category и использовать $max, чтобы получить самую раннюю дату:

db.things.aggregate([
    {
        $group: {
            _id: "$category",
            date: { $max: "$date" }
        }
    },
    {
        $project: {
            _id: 0,
            category: "$_id",
            date: 1
        }
    }
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...