2012-06-05 68 views
2

我正在展示一個mongodb集合文檔結構的例子。我也顯示了我的預期結果,同時進行查詢,我已經顯示。如何返回mongodb內部數組中的部分數組匹配?

文檔結構::

{ 
    _id : "132423423", 
    name : "hi_code", 
    my_entries : [ 
     { 
      e_id : "12345", 
      e_name : "f1", 
      e_posted : "2010-05-01", 
     }, 
     { 
      e_id : "12346", 
      e_name : "f2", 
      e_posted : "2010-06-01", 
     }, 
     { 
      e_id : "12346", 
      e_name : "f3", 
      e_posted : "2010-03-02", 
     } 
    ] 
} 

查詢結構::

db.myCollection.find({ my_entries : { $elemMatch : { e_posted : "2010-06-01", 
e_name : "f2" } } }) 

預期結果::

{ 
    _id : "132423423", 
    name : "hi_code", 
    my_entries : [ 
     { 
      e_id : "12346", 
      e_name : "f2", 
      e_posted : "2010-06-01", 
     } 
    ] 
} 

我並不想用地圖降低,是因爲我我正在處理大型數據庫,這會使其性能變慢,只想通過find查詢來實現。

回答

3

您的實際結果是與查詢匹配的整個文檔。

您只希望返回部分文檔,但無法指定在2.0中只返回匹配的數組元素。

從版本2.2(下一個生產版本當前可用作unstable版本2.1)開始,您將能夠使用聚合框架在本示例中獲取所需內容。

2.2還支持$elemMatch as a projection operator - 請注意,這將返回至多一個匹配數組元素。

隨着聚合框架,你可以做這樣的事情:

db.myCollection.aggregate([ 
    {$match : { my_entries : { $elemMatch : { e_posted : "2010-06-01", e_name : "f2" } } } }, 
    {$unwind : "$my_entries"}, 
    {$match : { my_entries : { e_posted : "2010-06-01", e_name : "f2" } } } 
]) 

,因爲在所有my_entries陣列匹配的條目這將返回儘可能多的文件。如果您想將它們歸爲一組,則需要在管道末端添加一個{$group:}條目。

+0

我可以使用任何其他技巧解決此問題,而無需mapreduce在mongodb版本2.0.4中使用。 –

+0

您可以在應用程序端執行此操作 - 匹配文檔,然後在檢索後取出所需內容。 –

+0

您只能通過$ slice運算符獲取數組的子集,但需要知道數組元素的位置。 –