@faleaksey

Как написать агрегацию с популяцией данных для следующей модели?

Есть 2 модели (Post и Author) которые передаются с помощью refPath в Data:

Модель Data:
import { model, Schema, Types } from 'mongoose';

const DataSchema = new Schema({
    page: { type: Types.ObjectId, ref: 'Page', required: true },
    instance: {
        type: Schema.Types.ObjectId,
        required: true,
        // Instead of a hardcoded model name in `ref`, `refPath` means Mongoose
        // will look at the `onModel` property to find the right model.
        refPath: 'fields'
    },
    fields: {
        type: String,
        required: true,
        enum: ['Post', 'Author']
    }
});

export const Data = model('Data', DataSchema);


Модель поста и автора:
import { model, Schema, Types } from 'mongoose';

const PostSchema = new Schema({
    title: String
});

export const Post = model('Post', PostSchema);


import { model, Schema, Types } from 'mongoose';

const AuthorSchema = new Schema({
    name: String
});

export const Author = model('Author', AuthorSchema);


есть запрос такого вида
const allData = await Data.find({ page: { $in: [...pages] } }).populate(['instance', 'page']);

но отдаёт всю дату по всем страницам в одном ответе, а по хорошему нужно разбить на группы типа:
[{страница, дата этой сраницы}, {страница, дата этой сраницы}, {страница, дата этой сраницы}]


знаю что можно как-то это решить с помощью агрегации но за последние сутки так и не получилось написать корректный запрос(
!!!ВАЖНО!!! чтобы все данные в массиве были приведены к виду документов (populate)

Решал вопрос с помощью $match, $lookup, $group, $project
но безуспешно(

Как реализовать подобный запрос ?
  • Вопрос задан
  • 27 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы