пн goose сортировать, ограничивать и затем различать - PullRequest
0 голосов
/ 05 апреля 2020

У меня есть модель Model в пн goose, где есть 3 поля. data, main_id и sub_id

Так что если я сделаю Model.find():

, я получу что-то вроде ниже

[
 {data: 5, main_id: A, sub_id: X, created: 5/4/2020}, 
 {data: 6, main_id: A, sub_id: Y, created: 5/4/2020}, 
 {data: 7, main_id: B: sub_id: M, created: 4/4/2020}, 
 {data:11, main_id: A, sub_id: X, created: 3/4/2020}, 
 {data:12, main_id: A, sub_id: Y, created: 4/4/2020}, 
 {data:13, main_id: A, sub_id: X, created: 4/4/2020}
]

Я хочу получить все поле data, уникальное для main_id: A, отсортированное по created и limit до 1 для каждого sub_id в main_id

Итак, в этом случае я хочу иметь возвращенный массив [5, 6], поскольку это самая последняя запись data для main_id: A и последняя для sub_id: X и Y, которые находятся под main_id: A соответственно.

1 Ответ

1 голос
/ 05 апреля 2020

Этого можно добиться, используя $ match , $ sort и $ group этапы агрегации.

Model.aggregate([
  {
    $match: {
      "main_id": "A"
    }
  },
  {
    $sort: {
      "created": -1
    }
  },
  {
    $group: {
      "_id": {sub_id: "$sub_id"},
      data: {
        "$first": "$data"
      }
    }
  }
])

Детская площадка

Результат:

[
  {
    "_id": "Y",
    "data": 6
  },
  {
    "_id": "X",
    "data": 5
  }
]

Обратите внимание, что метод .aggregate () всегда возвращает объекты, поэтому в приложении express вы можете просто создать карту, чтобы преобразовать ее в [5, 6].

...