Как изменить иерархию данных с помощью агрегирования/заполнения?

#mongodb #aggregation-framework

Вопрос:

У меня есть три коллекции, для целей этой иллюстрации, пожалуйста, следуйте за мной с этой немного проблематичной метафорой книжного магазина!

3 Коллекции; Книги, Страницы и Категории. В книгах много Страниц, и каждая Страница классифицируется в соответствии с ее содержанием.

 var page = mongoose.Schema({    
    book          : { type: Schema.Types.ObjectId, ref: 'Book' },
    category      : { type: Schema.Types.ObjectId, ref: 'Category' },
    content       : { type: String }
});

var book = mongoose.Schema({    
    pages       : [{ type: Schema.Types.ObjectId, ref: 'Author' }], 
    pageCount   : { type: Number },
    title       : { type: String },
});

var category = mongoose.Schema({
    title           : String,
    color           : String,
    sortOrder       : Number
});
 

Учитывая идентификатор книги, я хотел бы просмотреть ее страницы и вернуть их в массив соответствующих категорий, чтобы в результате получить что-то подобное…

 {
    categories: [
        {
            title: "Diagrammatical",
            color: "Red",
            sortOrder: 1,
            pages: [
                {
                    _id: ObjectId("a3j3n2i"),
                    book: ObjectId("12345"),
                    content: "Page Content Here"
                },
                {
                    _id: ObjectId("30gjkdi2g"),
                    book: ObjectId("67890"),
                    content: "Other Page Content Here"
                }
            ]
        },
        {
            title: "Prose",
            color: "Green",
            sortOrder: 2,
            pages: [
                {
                    _id: ObjectId("abcdefg"),
                    book: ObjectID("12345"),
                    content: "Page Content Here"
                },
                {
                    _id: ObjectId("hijklmn"),
                    book: ObjectId("67890"),
                    content: "Other Page Content Here"
                }
            ]
        }
    ]    
}
 

В моем случае использования не имеет смысла делать страницы свойством коллекции категорий, но было бы так полезно иметь возможность захватывать категории для конкретной книги с вложенными в них страницами. есть ли способ выполнить такого рода манипуляции с использованием агрегации и популяции?