gpt4 book ai didi

java - Java中MongoDB的MapReduce函数返回null

转载 作者:可可西里 更新时间:2023-11-01 10:35:23 26 4
gpt4 key购买 nike

我的 MongoDB 中有一些测试数据:

> db.test2.find()
{ "_id" : ObjectId("4e76ad8e9d7dc2438ab63dbb"), "name" : "John", "number" : 2 }
{ "_id" : ObjectId("4e76ad8e9d7dc2438ab63dbc"), "name" : "Jane", "number" : 1 }
{ "_id" : ObjectId("4e76ad8e9d7dc2438ab63dbd"), "name" : "John", "number" : 2 }
{ "_id" : ObjectId("4e76ad8e9d7dc2438ab63dbe"), "name" : "Jane", "number" : 1 }

当我使用以下 map/reduce 函数时,MongoDB 返回正确答案。

> m = function() { emit(this.name, {count: 1, sum: this.number}); }

> r = function(key, values) {
var n = { count: 0, sum: 0};
for (var i=0; i<values.length; i++) {
n.sum += values[i].sum;
n.count += values[i].count;
}
return n;
}

> db.test2.mapReduce(m, r, {out: 'test_col2'})
> db.test_col2.find()
{ "_id" : "Jane", "value" : { "count" : 2, "sum" : 2 } }
{ "_id" : "John", "value" : { "count" : 2, "sum" : 4 } }

但是如果我测试下面的Java程序,结果值为NULL。

public void run() throws Exception {
m = new Mongo(HOST, PORT);
db = m.getDB("test");

DBCollection col = db.getCollection("test2");

StringBuilder sbMap = new StringBuilder();
sbMap.append("function() {");
sbMap.append(" emit(this.name, {count:1, sum:this.number});");
sbMap.append("}");

StringBuilder sbReduce = new StringBuilder();
sbMap.append("function(key, values) {");
sbMap.append(" var n = { count: 0, sum: 0};");
sbMap.append(" for (var i=0; i<values.length; i++) {");
sbMap.append(" n.count += values[i].count;");
sbMap.append(" n.sum += values[i].sum;");
sbMap.append(" }");
sbMap.append(" return n;");
sbMap.append("}");

MapReduceCommand cmd = new MapReduceCommand(col, sbMap.toString(), sbReduce.toString(), null,
MapReduceCommand.OutputType.INLINE, null);

MapReduceOutput out = col.mapReduce(cmd);

for (DBObject o : out.results()) {
System.out.println( o.toString() );
}
}

结果:

{ "_id" : "Jane" , "value" :  null }
{ "_id" : "John" , "value" : null }

有什么问题?我无法理解。 :(

最佳答案

这是因为在你定义了 sbReduce 变量之后,你再也没有向它添加任何东西。您错误地将函数添加到 sbMap 变量。例如,你的 reduce 函数的第一行是:sbMap.append(...) 它应该是 sbReduce.append(...).

关于java - Java中MongoDB的MapReduce函数返回null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7467092/

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