Получить массив с глубокими вложениями из агрегата mongodb и включить в результат - PullRequest
0 голосов
/ 24 сентября 2019

Допустим, у меня есть эти две коллекции

book: {
    _id: 'aaa'
    name: 'Book 1',
    chapters: [
       0: {
           _id: 'chapter0',
           name: 'Chapter 1',
           pages: [
                0: {
                    _id: 'page0',
                    name: 'Page 1',
                    paragraphs: [
                        0: {
                            _id: 'paragraph0',
                            name: 'Paragraph 1',
                            bookmarks: [
                                 0: {sentence: 3, reader: 'Foo'},
                                 1: {sentence: 8, reader: 'Bar'},
                                 2: {sentence: 14, reader: 'John'}
                            ]
                        }
                    ]
                }
           ]
       }
    ]
}



book: {
    _id: 'bbb'
    name: 'Book 2',
    chapters: [
       0: {
           _id: 'chapter0',
           name: 'Chapter 1',
           pages: [
                0: {
                    _id: 'page0',
                    name: 'Page 1',
                    paragraphs: [
                        0: {
                            _id: 'paragraph0',
                            name: 'Paragraph 1',
                            bookmarks: []
                        },
                        1: {
                            _id: 'paragraph1',
                            name: 'Paragraph 2',
                            bookmarks: [
                                 0: {sentence: 2, reader: 'George'},
                                 1: {sentence: 1, reader: 'Paul'},
                                 2: {sentence: 76, reader: 'John'},
                                 3: {sentence: 54, reader: 'Ringo'}                                 
                            ]
                        }
                    ]
                }
           ]
       }
    ]
}

Я хочу иметь возможность извлечь массив bookmarks и присоединить их к коллекции book при получении результата.Что-то вроде этого было бы хорошо:

{
    id: 'aaa'
    name: 'Book 1'
    bookmarks: [{...}, {...}, {...}] //since the first book has 3 bookmarks
},
{
    id: 'bbb'
    name: 'Book 2'
    bookmarks: [{...}, {...}, {...}, {...}] //since the second book has 4 bookmarks
},

И если нет закладок, это должно выглядеть так:

{
    id: 'aaa'
    name: 'Book 1'
    bookmarks: [{...}, {...}, {...}] //since the first book has 3 bookmarks
},
{
    id: 'bbb'
    name: 'Book 2'
    bookmarks: [{...}, {...}, {...}, {...}] //since the second book has 4 bookmarks
},
{
    id: 'ccc'
    name: 'Book 3'
    bookmarks: [] //third book does not have bookmarks for example
},

Я пробовал агрегацию с этим кодом, но он просто разделяеткаждая закладка на книгу и толкает ее в объект.

return yield Books.aggregate()
    .unwind('chapters')
    .unwind('chapters.pages')
    .unwind('chapters.pages.paragraphs')
    .unwind('chapters.pages.paragraphs.bookmarks')
    .group({
        _id: '$_id',
        books: {
            $push: {
                _id: '$_id',
                name: '$name',
                bookmarks: '$chapters.pages.paragraphs.bookmarks'
            }
        }
    }).exec()

Может ли кто-нибудь указать мне правильное направление?Спасибо!

1 Ответ

1 голос
/ 24 сентября 2019

Попробуйте ниже совокупного конвейера:

Books.aggregate([
  {
    $unwind: "$book"
  },
  {
    $unwind: "$book.chapters"
  },
  {
    $unwind: "$book.chapters.pages"
  },
  {
    $unwind: "$book.chapters.pages.paragraphs"
  },
  {
    $unwind: {
      path: "$book.chapters.pages.paragraphs.bookmarks",
      preserveNullAndEmptyArrays: true
    }
  },
  {
    $group: {
      _id: {
        _id: "$_id",
        book: "$book.name"
      },
      bookmarks: {
        $push: "$book.chapters.pages.paragraphs.bookmarks"
      }
    }
  }
])
...