2013-11-14 49 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