Допустим, у меня есть три студента ...
Алиса, она всегда там в пятницу.
{
"name" : "Alice",
"goes" : {
"mondays" : {
"fr" : 900,
"to" : 1400
},
"fridays" : {
"fr" : 700,
"to" : 1600
},
}
}
И боб, здесь должна быть там на первое января
{
"_id" : ObjectId("5284a7085d60338b40b8f17d"),
"name" : "Bob",
"goes" : {
"mondays" : {
"fr" : 800,
"to" : 1200
},
"special" : [
{
"date" : "2010-01-01",
"fr" : 1000,
"to" : 1500
}
]
}
}
И Clair, которые не будут attenging по понедельникам или в 10.00
{
"_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
}
]
}
}
Я хочу, чтобы найти все студенты, которые должны посещать в пятницу в 7 оччах 10 января 2010 года
Так что я делаю это с базой агрегации.
db.students.aggregate(
[
{
$unwind: "$goes.special"
},
{
$match: {
$or : [
{
'goes.fridays.fr': 700,
},
{
'goes.special.date' : '2010-01-01',
'goes.special.fr': 1000
}
]
}
}
]
)
Но Алиса не появляется. В нем четко указано, почему в документах mongodb, http://docs.mongodb.org/manual/reference/operator/aggregation/unwind/ на самом дне.
«Если указать целевое поле $ разматывать, который содержит пустой массив ([]) в качестве входного документа, трубопровод игнорирует входной документ, и воли не генерирует результирующие документов.»
Я мог бы решить это, добавив в него массив с нулевым значением, но это не похоже на хорошее решение.
Есть ли способ, которым я мог бы расслабиться, не игнорировать документы, которые не имеют данных в $ unwind'ed массиве?
Есть ли необходимость в '$ unwind'ed результате, кроме того, что вы упомянули в своем вопросе? –