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

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

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


如果参数在多行中,则返回的retval为null(ok为1.0)。

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


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

最佳答案

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]

10-07 19:01