Есть ли способ обойти поиск mon go $ из перезаписанного поддокумента? - PullRequest
1 голос
/ 06 марта 2020

Я бился головой об это некоторое время. Опыт MongoDB ограничен / устарел, но я выполняю $lookup, который присоединяется так, как мне бы хотелось. Тем не менее, as переписывает весь мой поддокумент. Я прочитал в документации, что это такое поведение, но я пытаюсь выполнить поиск, используя вложенную ссылку, которая работает, но затем установить объединяющие данные для этой ссылки (или, по крайней мере, в этой подпрограмме). документ) вместе с существующими данными, которые находятся внутри вложенного документа.

У меня также есть сложность в том, что этот лог c - по законным причинам - не работает из Id

Пример команды макета ниже:

db.getCollection('agendas').aggregate([
        {
          $match: {
            'book.author._id': ObjectId('author-id')
          }
        },
        {
          $lookup:
          {
            from: 'author',
            // an array of keys e.g. ['penguin', 'puffin']
            localField: 'book.author.publishers',
            foreignField: 'pub_key',
            as: 'book.author.publishers'
          }
        },
])

Вывод:

{
    book: {
        name: 'The Bible',
        author: {
            publishers: [
                ...allJoinedPublishersData
            ]
        }
    }
}

Так что моя проблема в том, что поиск работает, но он уничтожает весь объект автора и все данные на вложенных уровнях - я боролся с слияния и группировки и не удалось заставить это работать. Какую команду использовать? Эффективно объединить существующий документ с присоединенными данными. Спасибо за любую помощь!

1 Ответ

1 голос
/ 06 марта 2020

Таким образом, $lookup создаст новое поле или перезапишет существующее поле с выводом из as. Когда вы as: 'book.author.publishers', он в основном пытается создать поле с именем book , имеющее author в качестве подчиненного элемента c & publishers в качестве вложенного элемента. сделать c автору. Так как $lookup может найти поле book в действительном do c - оно заменит поле book с выводом поиска. Таким образом, вместо этого вы можете попробовать, как показано ниже:

[
    {
        $match: {
            'book.author._id': ObjectId('author-id')
        }
    },
    {
        $lookup:
        {
            from: 'author',
            // an array of keys e.g. ['penguin', 'puffin']
            localField: 'book.author.publishers',
            foreignField: 'pub_key',
            as: 'publishers' // write it to a field named publishers
        }
    },
    { $addFields: { 'book.author.publishers': '$publishers' } }, // Now overwrite your actual 'book.author.publishers' like this
    { $project: { publishers: 0 } } // Remove the unnecessary field publishers
]

Примечание: Вы можете избежать двух этапов, т.е. $addFields & $project, используя $project напрямую вместо addFields, но все зависит от требований и структуры вашего документа.

...