MongoDB のアグリゲーションは、刻一刻と指数関数的に複雑になります!
私は、ネストされた配列に関しては、巻き戻されたネストされた配列から各オブジェクトのby theを$unwind
実行します。私の最後の試みは、で巻き戻しを元に戻すことです。ただし、元の埋め込み配列を、元のプロパティ名と、各ドキュメントの残りの元の直接のプロパティと共に再構築することはできません。$lookup
_id
$group
これまでの私の試みは次のとおりです。
db.users.aggregate([
{
$unwind: "$profile",
$unwind: {
path: "$profile.universities",
preserveNullAndEmptyArrays: true
}
},
{
$lookup: {
from: "universities",
localField: "profile.universities._id",
foreignField: "_id",
as: "profile.universities"
}
},
{
$group: {
_id: "$_id",
emails: { "$first": "$emails" },
profile: { "$first": "$profile" },
universities: { "$push": "$profile.universities" }
}
}
]).pretty()
私が得るものは次のようなものです:
{
"_id" : "A_USER_ID",
"emails" : [
{
"address" : "AN_EMAIL_ADDRESS",
"verified" : false
}
],
"profile" : {
"name" : "NAME",
"company" : "A COMPANY",
"title" : "A TITLE",
"phone" : "123-123-1234",
"disabled" : false,
"universities" : [
{
"_id" : "ID_1",
"name" : "UNIVERSITY_NAME_1",
"code" : "CODE_1",
"styles" : {AN_OBJECT}
}
]
},
"universities" : [
[
{
"_id" : "ID_1",
"name" : "UNIVERSITY_NAME_1",
"code" : "CODE_1",
"styles" : {AN_OBJECT}
}
],
[
{
"_id" : "ID_2",
"name" : "UNIVERSITY_NAME_2",
"code" : "CODE_2",
"styles" : {AN_OBJECT}
}
]
]
}
この結果には 2 つの問題があります。
- 元のネストされた配列に対して単一の要素配列が返されたため、結果
universities
はそれぞれ 1 つのオブジェクトの配列の配列になります。オブジェクトの単なる配列である必要があります。$lookup
$profile.universities
- 結果
universities
は、 の下にネストされた元の場所に配置されprofiles
ます。演算子profile.universities
を使用しているため、オリジナルがそのままである理由はわかっています。$first
この背後にある私の意図はprofile
、元のネストされたuniversities
配列を保持することと併せて、 の元のプロパティをすべて保持することです。
最終的に、私が必要とするのは次のようなものです:
{
"_id" : "A_USER_ID",
"emails" : [
{
"address" : "AN_EMAIL_ADDRESS",
"verified" : false
}
],
"profile" : {
"name" : "NAME",
"company" : "A COMPANY",
"title" : "A TITLE",
"phone" : "123-123-1234",
"disabled" : false,
"universities" : [
{
"_id" : "ID_1",
"name" : "UNIVERSITY_NAME_1",
"code" : "CODE_1",
"styles" : {AN_OBJECT}
},
{
"_id" : "ID_2",
"name" : "UNIVERSITY_NAME_2",
"code" : "CODE_2",
"styles" : {AN_OBJECT}
}
]
}
}
$group
これを達成する代わりに使用できる別の演算子はありますか? それとも、目的を$group
間違って理解していますか?
編集:これはコンテキストの元の投稿です: Mongo $lookup が左外部結合の場合、一致しないドキュメントが除外されるのはなぜですか?