【问题标题】:MongoDB grouping returns only one document, even though it matches many documents?MongoDB 分组只返回一个文档,即使它匹配许多文档?
【发布时间】:2011-12-08 01:21:30
【问题描述】:

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

它是最后插入的文档。

我应该怎样才能得到所有匹配的结果!?

谢谢

【问题讨论】:

    标签: mongodb


    【解决方案1】:

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

    只需执行db.collection.find(query-document),在您的情况下是:

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

    更新以解决新信息:

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

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

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

    【讨论】:

    • 实际上查询结果将用于自动完成目的,但我不想为此发送完整的文档,我还想将查询结果格式化为 {id:'' 的标准,名称: '',电子邮件:'' 照片:''}。早些时候,我手动进行格式化(获取查询结果并遍历所有结果文档并创建新格式)。后来我才知道我可以使用 mongo 本身来做到这一点。这就是我想要在那里做的事情。我只是使用查询来获取所有匹配的文档并尝试使用分组对其进行格式化。 mongo 有可能吗?
    • 你确定Using map reduce to format the output is not the intended use and will only serve to slow the query down 关于这个。因为我已经在做你所说的一切了。我必须格式化数据以概括并从各种集合中获取通用模式。如果必须将查询结果概括为通用格式,我手动在各个地方编写代码。相反,我更喜欢数据库来做。
    • 我几乎不记得,类似的事情可以从关系数据库中实现。我认为它在RDBMS 中使用了as 关键字来获得我在mongo 中需要的结果。我认为mongo grouping 与此类似。现在,我想我错了。谢谢朋友的关心。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-09
    • 2015-10-31
    • 2017-04-02
    • 2013-10-04
    • 1970-01-01
    • 2020-08-26
    • 2020-11-17
    相关资源
    最近更新 更多