gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:48:06 26 4
gpt4 key购买 nike

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

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

我有一个集合 collectionA,其中包含如下文档:

{
"_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 万个文档,它抛出了这个异常。

Exception in thread "pool-3-thread-5" com.mongodb.MongoCommandException: Command failed with error 15: 'cannot insert document because it exceeds 180 levels of nesting' on server localhost:27017. The full response is { "ok" : 0.0, "errmsg" : "cannot insert document because it exceeds 180 levels of nesting", "code" : 15, "codeName" : "Overflow" } at com.mongodb.connection.ProtocolHelper.getCommandFailureException(ProtocolHelper.java:115) at com.mongodb.connection.CommandProtocol.execute(CommandProtocol.java:114) at

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

提前致谢。

最佳答案

原来我对 reduce 函数的工作方式有误解。仅仅靠运气(或者说倒霉,真的),它在处理少量数据时运行良好。我将 map 函数更改为 emit(parent, {result:[child]});和减少功能:

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

很有魅力。

关于MongoDB 无法插入文档,因为它超过了 180 级嵌套,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47718344/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com