Получение первого созданного документа и группировка по имени поля в MongoDB - PullRequest
0 голосов
/ 06 марта 2020

Я хотел бы создать самый первый отдел для каждой компании, однако меня смущает совокупный запрос.

Документы:

[
 {
  _id: "5b7579f2deea1c6e46fd9739",
  name: "Sales",
  companyId: "123",
 },
 {
   _id: "5c5779f1dffe1c6e45df3973",
   name: "Security",
   companyId: "123",
 },
 {
   _id: "5d9759f5ceda1c6e64df9772",
   name: "Human Resource",
   companyId: "789",
 },
]

Я ожидаю такой результат:

Ожидаемый результат:

[
 {
  _id: "5b7579f2deea1c6e46fd9739",
  name: "Sales",
  companyId: "123",
 },
 {
   _id: "5d9759f5ceda1c6e64df9772",
   name: "Human Resource",
   companyId: "789",
 },
]

Но я получаю только один результат с моим запросом.

Фактический результат:

[
 {
  _id: "5b7579f2deea1c6e46fd9739",
  name: "Sales",
  companyId: "123",
 },
]

Совокупный запрос:

db.getCollection('departments').aggregate([
  {
    $sort:{ item: 1 }
  },
  {
    $group: {
        _id:'$item',
      companyId: { $first:'$companyId'},
      name: { $first:'$name'},
    }
  }
])

1 Ответ

1 голос
/ 06 марта 2020

Вам необходимо сгруппировать по полю companyId, например:

db.departments.aggregate([
  {
    $group: {
      _id: "$companyId",
      doc: {
        $first: "$$ROOT"
      }
    }
  },
  {
    $replaceRoot: {
      newRoot: "$doc"
    }
  }
])

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

Если у вас есть поле естественной сортировки, например поле даты, оно было бы хорошо применить этап сортировки в этом поле перед групповым этапом.

...