2013-11-14 3 views
0

Допустим, у меня есть три студента ...

Алиса, она всегда там в пятницу.

{ 
    "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 массиве?

+0

Есть ли необходимость в '$ unwind'ed результате, кроме того, что вы упомянули в своем вопросе? –

ответ

1

Не обязательно $unwind. Простой $match в трубопроводе достаточно:

pipeline = [ 
    { 
     "$match" : { 
      "$or" : [ 
       { 
        "goes.fridays.fr" : 700 
       }, 
       { 
        "goes.special" : { 
         "$elemMatch" : { 
          "date" : "2010-01-01", 
          "fr" : 1000 
         } 
        } 
       } 
      ] 
     } 
    } 
] 

db.students.aggregate(pipeline) 

Это можно легко сделать даже без рамок агрегации.

query = { 
    "$or" : [ 
     { 
      "goes.fridays.fr" : 700 
     }, 
     { 
      "goes.special" : { 
       "$elemMatch" : { 
        "date" : "2010-01-01", 
        "fr" : 1000 
       } 
      } 
     } 
    ] 
} 

db.students.find(query) 
+0

Спасибо за ответ, но я не могу заставить его работать со своим третьим учеником, Клэр:/ – Joelbitar

+0

Теперь он должен работать. – zero323

+0

Спасибо! Работы любят очарование! – Joelbitar

Смежные вопросы