我正在测试mongodb中的grouping功能。
group函数将对象作为参数。在对象中,它们有一个名为cond
的键,其值可用作查询以匹配文档。
我正在传递一个匹配多个文档的有效查询。但分组仅返回最后匹配的文档的结果。我想我在这里遗漏了一些东西,使group
函数返回所有匹配的文档结果。
我所做的步骤是,
db.test.insert({user:{name:"xxxx1"}});
db.test.insert({user:{name:"xxxx2"}});
db.test.insert({user:{name:"xxxx3"}});
db.test.insert({user:{name:"xxxx4"}});
db.test.insert({user:{name:"xxxx5"}});
db.test.insert({user:{name:"xxxx6"}});
db.test.group({
initial:{name:'', id:''},
reduce:function(d, o){o.name = d.user.name; o.id=d._id;},
finalize:function(o){},
cond:{"user.name":/^x/}
});
以上命令返回
[
{
"name" : "xxxx6", "id" : ObjectId("4edf72baec65faac52976e72")
}
]
它是最后插入的文件。
我应该得到所有匹配的结果!?
由于
答案 0 :(得分:1)
“返回所有匹配的文档结果”意味着您可能希望进行查询而不是组。分组将用于基于密钥聚合文档,而不是简单地返回所有匹配(您想要的)的文档。
只做db.collection.find(query-document)
,在你的情况下是:
db.test.find({"user.name": /^x/})
更新以解决新信息:
“我不想发送完整的文件”
然后使用find的第二个参数,以提供包含您想要的字段{ "user.name": 1 }
的文档。请注意,默认情况下会包含_id,但如果您想使用{_id: 0}
,则可以将其排除。
至于格式化,如果存储顺序很重要,那么使用数组。如果订单无关紧要且仅用于显示目的,则只在客户端进行订购。使用map reduce来格式化输出不是预期用途,只会减慢查询速度。