1

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

我知道我可以使用 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,因此没有聚合,并且结果比组支持的要多。

4

1 回答 1

2

更新到 2.4 并使用聚合:)

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

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

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

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

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

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

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

MapReduce 也很难调试故障排除。

tl;博士:更新到 2.4

于 2013-09-16T13:59:01.917 回答