MongoDB无法插入文档,因为它超过180级嵌套

时间:2017-12-08 16:25:08

标签: mongodb mapreduce nested reduce

我是MongoDB的新手,我非常感谢你的帮助。

我正在尝试使用MongoDB的java驱动程序3.4.2进行map / reduce。

我有一个集合集合A,其中包含以下文档:

{
    "_id" : ObjectId("5a29a6757c5def07307a4b6f"),
    "someProperty1" : "454545",
    "someProperty2" : "1234",
    "myArray" : [ 
        "1", 
        "2", 
        "3", 
    ]
}

我想得到myArray的所有组合:[1,2] [1,3] [2,1] [2,3] [3,1] [3,2]

最长的myArray有20个元素。

我尝试过使用以下内容:

db.collectionA.mapReduce(
    function () {
        var elem= this;
        this.myArray.forEach(function (parent) {
            elem.myArray.forEach(function (child) {
                if (parent !== child)
                    emit(parent, child);
                });
        });
    },

    function (key, values) {
        return {
            result: Array.from(new Set(values))
        };
    },
    {
        query: {
            $where: "this.myArray.length > 1"
        },
        out: "collectionB"
    });

当我用少量数据进行测试时,它工作正常。现在的问题是我在源集合中有2150万个文档,它正在抛出这个异常。

  

线程“pool-3-thread-5”中的异常   com.mongodb.MongoCommandException:命令失败,错误15:   '无法插入文档,因为它超过了180个嵌套级别'   server localhost:27017。完整的回答是{“ok”:0.0,“errmsg”:   “无法插入文档,因为它超过180级嵌套”,   “code”:15,“codeName”:“溢出”}   com.mongodb.connection.ProtocolHelper.getCommandFailureException(ProtocolHelper.java:115)     在   com.mongodb.connection.CommandProtocol.execute(CommandProtocol.java:114)     在

我做错了什么?什么是正确的方法来解决这个问题?

提前致谢。

1 个答案:

答案 0 :(得分:1)

嗯,事实证明我对reduce函数的工作方式存在误解。仅靠运气(或运气,真的),它一直处理好少量数据。我将map函数更改为emit(parent,{result:[child]}); 并将reduce函数改为:

function (key, values) {
    resultSet = new Set();
    values.forEach(function (partialResult) {
        partialResult.result.forEach(function (elem) {
            resultSet.add(elem);
        });
    });
    return {
        result: Array.from(resultSet)
    };
}

就像一个魅力。