1

我正在尝试使用聚合框架将许多字符串组合在一起以识别唯一的字符串。我还必须保留有关其余字段的一些信息。这类似于我在 mysql 中使用 * 运算符和 group by 语句。

SELECT * 
FROM my_table
GROUP BY field1 

我试过使用聚合框架,它只是为了获得唯一的字段而工作得很好。

db.mycollection.aggregate({ 
    $group : { _id : "$field1"}
    })

如果我想要与此相关的其他领域怎么办。MySQL 只会给我出现在组中的第一个(我很好)。这就是我认为 $first 运算符所做的。

db.mycollection.aggregate({
  $group : { 
       _id : "$field1",
       another_field : {$first : "$field2"}
  }})

这样,它按 field1 分组,但仍然让我返回附加到文档的其他字段。当我尝试这个时,我得到:

 exception: aggregation result exceeds maximum document size (16MB)

我有一种感觉是因为它将整个聚合返回为一个文档。我可以将它作为另一个 json 数组返回吗?

提前致谢

4

3 回答 3

3

您正在正确地进行聚合,但正如错误消息所示,调用的完整结果不能aggregate大于 16 MB。

解决方法是添加一个过滤器以减小结果的大小,或者使用 map-reduce 代替并将结果输出到另一个集合。

于 2012-12-27T01:21:30.080 回答
2

如果结果的唯一值不超过 2000,则可以使用 group() 函数,例如

db.mycollection.group( {key : {field1 : 1, field2 : 1}}, reduce: function(curr, result){}, initial{} })

最后一个选项是 map reduce:

db.mycollection.mapReduce( function() { emit( {field1 :1, field2: 1}, 1); }, function(key, values) { return 1;}, {out: {replace: "unique_field1_field2"}})

并且您的结果将在“unique_field1_field2”集合中

于 2013-03-04T23:06:25.537 回答
1

另一种选择是使用以下distinct功能:

db.mycollection.distinct('field1')

此函数接受第二个参数,即查询,您可以在其中过滤文档。

于 2012-12-27T01:24:44.893 回答