我正在尝试使用聚合框架将许多字符串组合在一起以识别唯一的字符串。我还必须保留其他字段的一些信息。这类似于我在mysql中使用*运算符和group by语句。
SELECT *
FROM my_table
GROUP BY field1
我尝试过使用聚合框架,它只是为了得到唯一的字段而工作正常。
db.mycollection.aggregate({
$group : { _id : "$field1"}
})
如果我想要其他字段,该怎么办? MySQL只会给我出现在组中的第一个(我很好)。这就是我认为的第一个运营商所做的事情。
db.mycollection.aggregate({
$group : {
_id : "$field1",
another_field : {$first : "$field2"}
}})
这样它按字段1分组,但仍然返回附加到文档的其他字段。当我尝试这个时,我得到:
exception: aggregation result exceeds maximum document size (16MB)
我有一种感觉是因为它将整个聚合作为一个文档返回。我可以将它作为另一个json数组返回吗?
提前致谢
答案 0 :(得分:3)
您正在正确进行聚合,但正如错误消息所示,aggregate
调用的完整result不能超过16 MB。
解决方法是添加过滤器以减小结果的大小,或者使用map-reduce,然后将结果输出到另一个集合。
答案 1 :(得分: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"集合
答案 2 :(得分:1)
另一种选择是使用distinct
函数:
db.mycollection.distinct('field1')
此函数接受第二个参数,即查询,您可以在其中过滤文档。