【问题标题】:Mongo find unique resultsMongo 找到独特的结果
【发布时间】:2013-09-16 12:51:14
【问题描述】:

从基于单个字段的唯一集合中获取所有文档的最简单方法是什么。

我知道我可以使用 db.collections.distrinct 来获取一个字段的所有不同值的数组,但我想为一个字段的每个不同值获取第一个(或实际上是任何一个)文档。

例如如果数据库包含:

{number:1, data:'Test 1'}
{number:1, data:'This is something else'}
{number:2, data:'I'm bad at examples'}
{number:3, data:'I guess there\'s room for one more'}

它会返回(基于 number 是唯一的:

{number:1, data:'Test 1'}
{number:2, data:'I'm bad at examples'}
{number:3, data:'I guess there\'s room for one more'}

编辑:我应该补充一点,服务器正在运行 Mongo 2.0.8,因此没有聚合,并且结果比组支持的要多。

【问题讨论】:

  • 升级到 2.4 并使用聚合 :)
  • 您可能会发现,即使您使用的版本支持聚合结果,也可能不支持您需要的结果集大小。
  • @Philipp 要是升级这么容易就好了。 @MustafaGenç 我将如何使用不同的?我认为这只能给我五个像[1,2,3]@WiredPrairie 目前我正在考虑大约 150k 的结果,但我期待它会增长......
  • @TomKiley 这对我来说很容易:关闭 mongod,复制二进制文件,重新启动 mongod。但那是在我的私人测试环境中。当您使用分片和身份验证时there is a bit more you have to do。但我也知道,当您为大型企业工作并尝试更新一些“关键任务”软件时,会涉及多少繁文缛节。

标签: mongodb pymongo


【解决方案1】:

更新到 2.4 并使用聚合 :)

当您因为繁文缛节而确实需要坚持使用旧版本的MongoDB时,您可以使用MapReduce

在 MapReduce 中,map 函数将集合中的每个文档转换为一个新文档和一个独特的键。 reduce函数用于将具有相同distincitve key的文档合并为一个。

您的地图函数将按原样发出您的文档,并将数字字段作为唯一键。它看起来像这样:

 var mapFunction = function(document) {
      emit(document.number, document);
 }

您的 reduce 函数接收具有相同键的文档数组,并且应该以某种方式将它们转换为一个文档。在这种情况下,它只会丢弃除第一个具有相同键的文档之外的所有文档:

var reduceFunction = function(key, documents) {
    return documents[0];
}

不幸的是,MapReduce 存在一些问题。它不能使用索引,因此对于集合中的每个文档至少执行两个 javascript 函数(可以通过使用 mapReduce 命令的查询参数预先排除一些文档来限制它)。当您有大量收藏时,这可能需要一段时间。您也无法完全控制 MapReduce 创建的文档是如何形成的。它们总是有两个字段,_id 带有密钥,value 带有您为密钥返回的文档。

MapReduce 也很难调试故障排除。

tl;dr: 更新到 2.4

【讨论】:

  • 感谢您为我设置 mapreduce。听起来我仍然需要做一些后处理来重新格式化返回的文档。升级肯定在待办事项清单上。
猜你喜欢
  • 2018-09-30
  • 1970-01-01
  • 1970-01-01
  • 2016-08-20
  • 2021-09-25
  • 2019-12-01
  • 2011-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多