3人の生徒がいるとしましょう...
アリス、彼女は金曜日にはいつもそこにいます。
{
"name" : "Alice",
"goes" : {
"mondays" : {
"fr" : 900,
"to" : 1400
},
"fridays" : {
"fr" : 700,
"to" : 1600
},
}
}
そしてボブ、ここは1月1日にそこにいるはずです
{
"_id" : ObjectId("5284a7085d60338b40b8f17d"),
"name" : "Bob",
"goes" : {
"mondays" : {
"fr" : 800,
"to" : 1200
},
"special" : [
{
"date" : "2010-01-01",
"fr" : 1000,
"to" : 1500
}
]
}
}
クレアは月曜と 10 時に欠席します。
{
"_id" : ObjectId("5284c2785d60338b40b8f17f"),
"name" : "Clair",
"goes" : {
"wednesdays" : {
"fr" : 1100,
"to" : 1500
},
"special" : [
{
"date" : "2010-01-01",
"fr" : 1600,
"to" : 1900
},
{
"date" : "2010-01-02",
"fr" : 1000,
"to" : 1300
}
]
}
}
2010 年 1 月 1 日の金曜日の 7 och 10 に出席するすべての学生を検索したい
そのため、集計フレームワークでこれを行います。
db.students.aggregate(
[
{
$unwind: "$goes.special"
},
{
$match: {
$or : [
{
'goes.fridays.fr': 700,
},
{
'goes.special.date' : '2010-01-01',
'goes.special.fr': 1000
}
]
}
}
]
)
しかし、アリスは現れません。それは、mongodb docs の一番下にある理由を明確に述べています。
「入力ドキュメントで空の配列 ([]) を保持する $unwind のターゲット フィールドを指定すると、パイプラインは入力ドキュメントを無視し、結果ドキュメントを生成しません。」
null値を含む配列を追加することで解決できましたが、それは良い解決策のようにはいきません。
$unwind'ed 配列にデータがないドキュメントを無視しないように unwind する方法はありますか?