我是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) 在
我做错了什么?什么是正确的方法来解决这个问题?
提前致谢。
答案 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)
};
}
就像一个魅力。