【问题标题】:MongoDB Distinct Count issueMongoDB Distinct Count 问题
【发布时间】:2016-11-18 12:07:35
【问题描述】:

我有以下数据的集合(集合包含超过 1000 万条记录)

> db.LogBuff.find()
{ "_id" : ObjectId("578899d5d2b76f77d083f16c"), "SUBJECT" : "DD", "SYS" : "A" }
{ "_id" : ObjectId("578899d5d2b76f77d083f16d"), "SUBJECT" : "AA", "SYS" : "B" }
{ "_id" : ObjectId("578899d5d2b76f77d083f16e"), "SUBJECT" : "BB", "SYS" : "A" }
{ "_id" : ObjectId("578899d5d2b76f77d083f16f"), "SUBJECT" : "AA", "SYS" : "C" }
{ "_id" : ObjectId("578899d5d2b76f77d083f170"), "SUBJECT" : "BB", "SYS" : "A" }
{ "_id" : ObjectId("578899d5d2b76f77d083f171"), "SUBJECT" : "BB", "SYS" : "A" }
{ "_id" : ObjectId("578899d5d2b76f77d083f172"), "SUBJECT" : "CC", "SYS" : "B" }
{ "_id" : ObjectId("578899d5d2b76f77d083f173"), "SUBJECT" : "AA", "SYS" : "A" }
{ "_id" : ObjectId("578899d5d2b76f77d083f174"), "SUBJECT" : "CC", "SYS" : "A" }
{ "_id" : ObjectId("578899d5d2b76f77d083f175"), "SUBJECT" : "DD", "SYS" : "A" }
{ "_id" : ObjectId("578899d5d2b76f77d083f176"), "SUBJECT" : "AA", "SYS" : "A" }
{ "_id" : ObjectId("578899d5d2b76f77d083f177"), "SUBJECT" : "BB", "SYS" : "C" }
{ "_id" : ObjectId("578899d5d2b76f77d083f178"), "SUBJECT" : "CC", "SYS" : "D" }
{ "_id" : ObjectId("578899d5d2b76f77d083f179"), "SUBJECT" : "DD", "SYS" : "A" }
{ "_id" : ObjectId("578899d5d2b76f77d083f17a"), "SUBJECT" : "AA", "SYS" : "B" }
{ "_id" : ObjectId("578899d5d2b76f77d083f17b"), "SUBJECT" : "BB", "SYS" : "B" }
{ "_id" : ObjectId("578899d5d2b76f77d083f17c"), "SUBJECT" : "AA", "SYS" : "A" }
{ "_id" : ObjectId("578899d5d2b76f77d083f17d"), "SUBJECT" : "CC", "SYS" : "C" }

我想得到以下类型的输出

{ "_id" : { "SUBJECT" : "CC", "SYS" : "C" }, "COUNT" : 1 }
{ "_id" : { "SUBJECT" : "DD", "SYS" : "A" }, "COUNT" : 3 }
{ "_id" : { "SUBJECT" : "AA", "SYS" : "B" }, "COUNT" : 2 }
{ "_id" : { "SUBJECT" : "AA", "SYS" : "C" }, "COUNT" : 1 }
{ "_id" : { "SUBJECT" : "CC", "SYS" : "B" }, "COUNT" : 1 }
{ "_id" : { "SUBJECT" : "BB", "SYS" : "A" }, "COUNT" : 3 }
{ "_id" : { "SUBJECT" : "BB", "SYS" : "C" }, "COUNT" : 1 }
{ "_id" : { "SUBJECT" : "AA", "SYS" : "A" }, "COUNT" : 3 }
{ "_id" : { "SUBJECT" : "CC", "SYS" : "A" }, "COUNT" : 1 }
{ "_id" : { "SUBJECT" : "CC", "SYS" : "D" }, "COUNT" : 1 }
{ "_id" : { "SUBJECT" : "BB", "SYS" : "B" }, "COUNT" : 1 }

这是我的代码

db.LogBuff.mapReduce(     
    function(){          
        emit( { SUBJECT : this.SUBJECT, SYS : this.SYS } , this.SYS);     
    },       
    function(key,values){          
        return $count:1  <-stuck here  
    } 
)

由于某些限制,我无法使用聚合方法。我使用了以下聚合代码:

db.LogBuff.aggregate([ {"$group" : {_id:{SUBJECT:"$SUBJECT",SYS:"$SYS"},COUNT:{$sum:1}}}, {$sort:{_id:1}},])

虽然这适用于有限数量的记录,但对于大量记录,它会返回此错误(注意 - 我不是 root 用户,因此我无法更改配置):

assert: command failed: { "ok" : 0, "errmsg" : "排序超出内存限制 104857600 字节,但未选择加入外部排序。中止操作。通过 allowDiskUse:true 选择加入。", “代码”:16819 }:
聚合失败_getErrorWithCode@src/mongo/shell/utils.js:25:13

【问题讨论】:

  • 尝试使用聚合框架?还是必须只使用 MapReduce?
  • 我使用了 Aggregation ,但它适用于有限的记录数量,大量它在内存错误后返回(我不是 root 用户,因此我无法更改配置)
  • assert: command failed: { "ok" : 0, "errmsg" : "排序超出内存限制 104857600 字节,但未选择外部排序。中止操作。将 allowDiskUse:true 传递给选择加入。”,“代码”:16819 }:聚合失败 _getErrorWithCode@src/mongo/shell/utils.js:25:13 doassert@src/mongo/shell/assert.js:13:14
  • 为什么分组后还要排序?您已经发布了未排序的所需输出,但您将其作为聚合阶段传递。它没有足够的内存来提取所有这些文档然后对它们进行排序。如果你放弃排序,你不应该有问题。更多信息可以在docs about sorting中找到

标签: mongodb mapreduce


【解决方案1】:

尝试使用 allowDiskUse 选项:

db.LogBuff.aggregate([ {"$group" : {_id:{SUBJECT:"$SUBJECT",SYS:"$SYS"},COUNT:{$sum:1}}}, {$sort:{_id:1}}], {allowDiskUse: true})

【讨论】:

    猜你喜欢
    • 2021-01-30
    • 1970-01-01
    • 1970-01-01
    • 2016-04-04
    • 2013-05-12
    • 2012-12-12
    • 2023-03-29
    • 2015-01-28
    • 1970-01-01
    相关资源
    最近更新 更多