2

我正在展示一个 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", 
        }
   ] 
} 

我不想为此使用 map reduce,因为我正在处理大型数据库,这会降低性能,只想通过查找查询使其成为可能。

4

1 回答 1

3

您的实际结果是与查询匹配的整个文档。

您期望只返回文档的一部分,但无法指定在 2.0 中只返回匹配的数组元素。

从 2.2 版开始(下一个生产版本目前作为不稳定的开发版本 2.1 可用),您将能够使用聚合框架来取回您在本示例中想要的内容。

2.2 还支持$elemMatch 作为投影运算符- 请注意,这将最多返回一个匹配的数组元素。

使用聚合框架,您可以执行以下操作:

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:}在管道末尾添加一个条目。

于 2012-06-05T05:24:45.720 回答