代码之家  ›  专栏  ›  技术社区  ›  roottraveller

Mongodb-group()无法处理超过20000个唯一密钥

  •  0
  • roottraveller  · 技术社区  · 6 年前

    我在经营一家公司 groupBy query 在我的mongo集群上。我在网上使用 SQL to mongo query converter 工具运行查询后,我得到一个错误。数据量很大。有办法吗?

    // SQL  query
    SELECT COUNT(*) AS count FROM db_name
    WHERE version="v2"
    GROUP BY id
    
    // Mongo query 
    db.db_name.group({
    "key": {
        "id": true
    },
    "initial": {
        "count": 0
    },
    "reduce": function(obj, prev) {
        if (true != null) if (true instanceof Array) prev.count += true.length;
        else prev.count++;
    },
    "cond": {
        "version": "v2"
    }
    });
    

    我得到了这个错误

     E QUERY    [js] Error: group command failed: {
    "operationTime" : Timestamp(1589898357, 1),
    "ok" : 0,
    "errmsg" : "Plan executor error during group command :: caused by :: group() can't handle more than 20000 unique keys",
    "code" : 2,
    "codeName" : "BadValue",
    "$clusterTime" : {
        "clusterTime" : Timestamp(1589898357, 1),
        "signature" : {
            "hash" : BinData(0,"SvsjmAIsn4rGwA/aRtLt3MPenJQ="),
            "keyId" : NumberLong("6784431306852794369")
        }
    }
    } :
    
    0 回复  |  直到 6 年前
        1
  •  2
  •   Community Mohan Dere    6 年前

    你可以用 db.collection.aggregate() 而是像:

    db.db_name.aggregate([
        { $match: { version: "v2" } },
        { $group: { _id: "$id", count: { $sum: 1 } } },
        { $project: { _id: 0 } }
    ])
    

    上面的聚合操作选择具有 version 等于“v2”,按 id 字段并计算 COUNT(*) 每人 身份证件 领域

    如中所述 docs :

    管道使用MongoDB中的本机操作提供高效的数据聚合,是 首选方法 用于MongoDB中的数据聚合。

    聚合管道可以在某些阶段使用索引来提高性能。此外,聚合管道还有一个内部优化阶段。