Объединение массивов из нескольких документов MongoDB - PullRequest
0 голосов
/ 26 мая 2018

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

Пока что с моим запросом (в Mongoose):

return mongoose.model('creators').find({
  id: {}
})

Я получаю следующие результаты:

[
    {
        "_id": "5b0891a3dcec4912601e32ce",
        "name": "CaptainDisillusion",
        "id": "UCEOXxzW2vU0P-0THehuIIeg",
        "videos": [
            {
                "_id": "5b0891a3dcec4912601e32cf",
                "name": "Quick D: A Fighter Jet Says Hi",
                "id": "-NPmBkYb_mY",
                "date": "2018-05-10T16:30:30.000Z"
            }
        ],
        "__v": 0
    },
    {
        "_id": "5b08967b66d8321034176afb",
        "name": "Curious Droid",
        "id": "UC726J5A0LLFRxQ0SZqr2mYQ",
        "videos": [
            {
                "_id": "5b0891a3dcec4912601e32cf",
                "name": "Guest post bloggers wanted for the Curious Droid website",
                "id": "sNLvdoValBw",
                "date": "2018-05-23T16:30:30.000Z"
            }
        ],
        "__v": 0
    }
]

В идеале я хотел бы вернуть что-то вроде:

"videos": [
            {
                "_id": "5b0891a3dcec4912601e32cf",
                "name": "Guest post bloggers wanted for the Curious Droid website",
                "id": "sNLvdoValBw",
                "date": "2018-05-23T16:30:30.000Z"
            },
            {
                "_id": "5b0891a3dcec4912601e32cf",
                "name": "Quick D: A Fighter Jet Says Hi",
                "id": "-NPmBkYb_mY",
                "date": "2018-05-10T16:30:30.000Z"
            }
        ]

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

Возможно ли это сделать, и если да, то как мне это сделать?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 26 мая 2018

Вам необходимо использовать $unwind, чтобы выровнять элементы массива, а затем продвинуть внутренний $videos в качестве нового корневого элемента вместе с $sort, чтобы заказать элемент видео.

0 голосов
/ 26 мая 2018

Вам нужно aggregate() вместо.Либо используя $unwind и $replaceRoot там, где он у вас есть:

return mongoose.model('creators').aggregate([
  // { "$match": { ... } },                      // A real condition to match the document
  { "$unwind": "$videos" },
  { "$replaceRoot": { "newRoot": "$videoes" } }
])

, либо используя $project со всеми полями в явном виде:

return mongoose.model('creators').aggregate([
  // { "$match": { ... } },                      // A real condition to match the document
  { "$unwind": "$videos" },
  { "$project": {
     "_id": "$videos._id",
     "name": "$videos.name",
     "id": "$videos.id",
     "date": "$videos.date"
  }}
])

Это единственное, что выводит содержимое встроенного массива на «верхний уровень» документа в выводе.

ПРИМЕЧАНИЕ : любые условия запросалибо для документа, либо для содержимого массива должно быть сделано "до" $unwind.Это означает применение $match, действительного для условий запроса, и, возможно, применение проекции $filter вначале к содержимому массива.Если вы не делаете это «первым», вы создаете ненужные издержки для своего приложения.

Весь процесс использования $unwind действительно очень дорогой в любом случае.Было бы гораздо разумнее хорошенько взглянуть на шаблоны запросов и действительно принять решение, стоит ли на самом деле сохранять документы встроенными или ваши запросы действительно чаще подходят для размещения документов в отдельной коллекции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...