带有多行字符串参数的 doEval()

doEval() With Multiline String Argument

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

我正在尝试使用 doEval() 来计算集合中的文档数。 (出于各种原因,我想使用 doEval() 而不是 count())。使用单行字符串参数 returns retval 调用 doEval(),double 值为 1.0,double 值为 1.0,这正是我所期望的:

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

如果参数在多行上,returned 的 retval 为 null(ok 为 1.0)。

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

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

来自 doEval() javadoc:

Evaluates JavaScript functions on the database server. This is useful if you need to touch a lot of data lightly, in which case network transfer could be a bottleneck.

Parameters:

code - String representation of JavaScript function

args - arguments to pass to the JavaScript function

所以您没有将 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]