0

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 する方法はありますか?

4

1 に答える 1