我正在展示一个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,因为我正在处理大型数据库,这将使其性能降低,只是想仅通过查找查询来实现。
您的实际结果是与查询匹配的整个文档。
您希望只返回文档的一部分,但无法指定在 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:}
条目。