Создать представление mongodb для вложенных коллекций - PullRequest
0 голосов
/ 18 января 2019

У меня есть несколько коллекций с вложенными коллекциями, и мне нужно иметь возможность получать вложенные коллекции, поскольку они не являются вспомогательными коллекциями. Допустим, у меня есть такая коллекция:

    [
            {author: "aa", books: [{title:"a", pages: 100}, {title: "b", pages: 200}]},
            {author: "ab", books: [{title:"c", pages: 80}, {title: "d", pages: 150}]}
    ]

Я хочу иметь возможность просматривать эту коллекцию так:

    [
            {author: "aa", books.title: "a", books.pages: 100},
            {author: "aa", books.title: "b", books.pages: 200},
            {author: "ab", books.title: "c", books.pages: 80},
            {author: "ab", books.title: "d", books.pages: 150}
    ]

Можно ли создать представление как то, что мне нужно, и отфильтровать его через веб-интерфейс?

Изменить после вопроса @mickl:

То, что я хочу, это показать каждую вложенную коллекцию в новой строке. У меня есть 2 записи в основной коллекции и 2 подколлекции в каждой записи. Поэтому я хочу получить 4 строки и хочу иметь возможность делать это на стороне базы данных, а не на стороне API.

1 Ответ

0 голосов
/ 21 января 2019

Таким образом, ключевая вещь здесь - это оператор $ unwind , который преобразует массив из n элементов в n элементы с одним поддокументом.

db.createView(
    "yourview",
    "yourcollection",
    [ { $unwind: "$books" } ]
)

Это даст вамдокументы в следующем формате:

{ author: "aa", books: { title: "a", pages: 100 } },
{ author: "aa", books: { title: "b", pages: 200 } },
{ author: "ab", books: { title: "c", pages: 80 } },
{ author: "ab", books: { title: "d", pages: 150 } }

РЕДАКТИРОВАТЬ: чтобы иметь ключи с точками в именах, вы можете запустить следующую команду:

db.createView(
    "yourview",
    "yourcollection",
    [   
        { $unwind: "$books" },
        {
            $project: {
                author: 1,
                books2: {
                    $map: { 
                        input: { $objectToArray: "$books" },
                        as: "book",
                        in: {
                            k: { $concat: [ "books.", "$$book.k" ] },
                            v: "$$book.v"
                        }
                    }
                }
            }
        },
        {
            $replaceRoot: {
                newRoot: { $mergeObjects: [ { author: "$author" }, { $arrayToObject: "$books2" } ] }
            }
        } 
    ]
)

В основном он использует $ objectToArray и $ arrayToObject , чтобы "заставить" MongoDB возвращать поля с точками в именах.Выходы:

{ "author" : "aa", "books.title" : "a", "books.pages" : 100 }
{ "author" : "aa", "books.title" : "b", "books.pages" : 200 }
{ "author" : "ab", "books.title" : "c", "books.pages" : 80 }
{ "author" : "ab", "books.title" : "d", "books.pages" : 150 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...