1

使用 Groovy 2.3.6、GMongo 1.2、Java 1.8、MongoDB 3.0.0...

我正在尝试使用doEval()来获取集合中的文档计数。(出于各种原因,我想使用doEval()而不是count())。使用单行字符串参数调用doEval()会返回双精度值为 1.0 的 retval 和双精度值为 1.0 的 ok,这正是我所期望的:

def str = "db.configurations.count({name: 'Mike'})"
database.doEval(str)

如果参数在多行上,则返回的 retval 为空(确定为 1.0)。

def str = "db.configurations.count({\nname: 'Mike'\n})"
database.doEval(str)

我希望 doEval 返回 1.0 而不是 null 的 retval,就像在第一个示例中一样。这是一个错误还是我的期望不正确?应该doEval()支持多行字符串参数吗?

4

1 回答 1

1

来自doEval()javadoc:

评估数据库服务器上的 JavaScript 函数。如果您需要轻而易举地接触大量数据,这很有用,在这种情况下,网络传输可能会成为瓶颈。

参数

code- JavaScript 函数的字符串表示

args- 传递给 JavaScript 函数的参数

因此,您没有将 javascript 函数传递给doEval方法。无论如何,您得到的结果与您可以直接调用 mongo shell 的结果一致:

> db.eval("db.configurations.count({name: 'Mike'})");
1
> db.eval("db.configurations.count({\nname: 'Mike'\n})");
null

(我没有深入研究 mongo shell javascript 内部... :-)

传递一个 javascript 函数,你可以得到你想要的结果:

println db.configurations.count([name: 'Mike'])

def str = '''function(name) {
    return db.configurations.count({
        name: name
    });
}'''
println db.doEval(str, 'Mike')

以上产生:

1
[serverUsed:/127.0.0.1:27017, retval:1.0, ok:1.0]
于 2015-04-20T11:10:31.083 回答