タイトルはそれをすべて言います。ドキュメントが一致フィールドに従って一致する外部ドキュメントにならない場合、どうしてパイプラインの結果セットに含まれないのですか?
私はMongo 3.2で新しいアグリゲーターをテストしています。私は、最初に巻き戻し、次にドキュメントをグループ化して、ネストされた配列ルックアップを実行するところまで行きました。私が残したのは、$lookup
基準を満たしていないすべてのローカルドキュメントを結果に含めることだけです。これは、「左外部結合」の標準的な定義であると私が考えたものです。
これがクエリです:
db.users.aggregate([
{
$unwind: "$profile",
$unwind: "$profile.universities"
},
{
$lookup: {
from: "universities",
localField: "profile.universities._id",
foreignField: "_id",
as: "profile.universities"
}
},
{
$group: {
_id: "$_id",
universities: {
$addToSet: "$profile.universities"
}
}
}
]).pretty()
したがって、空のprofile.universities
配列を持つuser
がある場合、一致を返す$lookup
に関係なく、それを結果セットに含める必要がありますが、そうではありません。これをどのように行うことができますか、そしてMongoがこのように動作するように$lookup
を構築した理由は何ですか?
この動作は$lookup
とは関係ありません。 $unwind
のデフォルトの動作は、参照されたフィールドが欠落しているドキュメントや空の配列であるドキュメントを省略するためです。
profile.universities
が空の配列であっても巻き戻されたドキュメントを保持するには、そのpreserveNullAndEmptyArrays
オプションをtrue
に設定します。
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",
universities: {
$addToSet: "$profile.universities"
}
}
}
]).pretty()