Таким образом, ключевая вещь здесь - это оператор $ 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 }