Группировка в MongoDb с использованием агрегата - PullRequest
0 голосов
/ 25 ноября 2018

Я новичок в MongoDB, и мне сложно понять функцию агрегирования.

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

На самом деле, у меня есть две схемы как:

1) Faculty.js

const FacultySchema = new Schema({

    name: {
        type: String,
        required: true
    }

});

2) Semester.js

const SemesterSchema = new Schema({

    name: {
        type: String,
        required: true
    },

    faculty: {
        type: Schema.Types.ObjectId,
        ref: 'faculties'
    }   

});

Коллекция семестров

[
  {
    "_id": ObjectId("5bf82da745209d0d48a91b62"),
    "name": "1st Semester",
    "faculty": ObjectId("5bf7f39a1972dd0b6c74de7d"),
    "__v": 0
  },
  {
    "_id": ObjectId("5bf8c3f945209d0d48a91b63"),
    "name": "2nd Semester",
    "faculty": ObjectId("5bf7f39a1972dd0b6c74de7d"),
    "__v": 0
  },
  {
    "_id": ObjectId("5bf8c3fe45209d0d48a91b64"),
    "name": "3rd Semester",
    "faculty": ObjectId("5bf7f39a1972dd0b6c74de7d"),
    "__v": 0
  },
  {
    "_id": ObjectId("5bf8c40345209d0d48a91b65"),
    "name": "4th Semester",
    "faculty": ObjectId("5bf7f39a1972dd0b6c74de7d"),
    "__v": 0
  }
]

То, что я хочу сгруппировать, это все эти семестры как массив, имеющий одинаковый идентификатор факультета в одном месте.Что-то вроде:

[
{faculty: "BBA", semesters: ['first', 'second', 'third']},
{faculty: "BCA", semesters: ['first', 'second', 'third']}
];

Как мне этого добиться ??

1 Ответ

0 голосов
/ 25 ноября 2018

Вы можете использовать $group агрегацию, чтобы сначала найти отличительный faculties, а затем $lookup, чтобы получитьnames из faculties из коллекции факультетов

Semester.aggregate([
  { "$group": {
    "_id": "$faculty",
    "semesters": { "$push": "$name" }
  }},
  { "$lookup": {
    "from": "faculties",
    "let": { "facultyId": "$_id" },
    "pipeline": [
      { "$match": { "$expr": { "$eq": ["$_id", "$$facultyId"] }}}
    ],
    "as": "faculty"
  }},
  { "$project": {
    "semesters": 1, "faculty": { "$arrayElemAt": ["$faculty.name", 0] }
  }}
])

Или вы можете сначала использовать $lookup, а затем $group отличные names

Semester.aggregate([
  { "$lookup": {
    "from": "Faculty",
    "let": { "facultyId": "$_id" },
    "pipeline": [
      { "$match": { "$expr": { "$eq": ["$_id", "$$facultyId"] }}}
    ],
    "as": "faculty"
  }},
  { "$unwind": "$faculty" },
  { "$group": {
    "_id": "$faculty.name",
    "semesters": { "$push": "$name" }
  }},
  { "$project": {
    "semesters": 1, "faculty": "$_id", "_id": 0 }
  }}
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...