MongoDB分组只返回一个文档,即使它与许多文档匹配?

时间:2011-12-07 14:16:42

标签: mongodb

我正在测试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") 
  } 
]

它是最后插入的文件。

我应该得到所有匹配的结果!?

由于

1 个答案:

答案 0 :(得分:1)

“返回所有匹配的文档结果”意味着您可能希望进行查询而不是组。分组将用于基于密钥聚合文档,而不是简单地返回所有匹配(您想要的)的文档。

只做db.collection.find(query-document),在你的情况下是:

db.test.find({"user.name": /^x/})

更新以解决新信息:

“我不想发送完整的文件”

然后使用find的第二个参数,以提供包含您想要的字段{ "user.name": 1 }的文档。请注意,默认情况下会包含_id,但如果您想使用{_id: 0},则可以将其排除。

至于格式化,如果存储顺序很重要,那么使用数组。如果订单无关紧要且仅用于显示目的,则只在客户端进行订购。使用map reduce来格式化输出不是预期用途,只会减慢查询速度。