2013-11-14 48 views
0

汇总文件聚集可以说我有三个学生...

爱丽丝,她总是在星期五。

{ 
    "name" : "Alice", 
    "goes" : { 
     "mondays" : { 
      "fr" : 900, 
      "to" : 1400 
     }, 
     "fridays" : { 
      "fr" : 700, 
      "to" : 1600 
     }, 
    } 
} 

和Bob,这里应该有第一一月

{ 
    "_id" : ObjectId("5284a7085d60338b40b8f17d"), 
    "name" : "Bob", 
    "goes" : { 
     "mondays" : { 
      "fr" : 800, 
      "to" : 1200 
     }, 
     "special" : [ 
      { 
       "date" : "2010-01-01", 
       "fr" : 1000, 
       "to" : 1500 
      } 
     ] 
    } 
} 

和Clair的谁也不会在周一或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 
      } 
     ] 
    } 
} 

被媒体查询我想找到所有那些应该在2010年1月1日上午7点10分参加的学生

所以我这样做与聚合框架。

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

谢谢!作品lika魅力! – Joelbitar