【问题标题】:doEval() With Multiline String ArgumentdoEval() 带多行字符串参数
【发布时间】:2015-04-14 17:50:20
【问题描述】:

使用 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 为 null(ok 为 1.0)。

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

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

【问题讨论】:

    标签: java mongodb groovy gmongo


    【解决方案1】:

    来自doEval()javadoc:

    评估数据库服务器上的 JavaScript 函数。这很有用 如果你需要轻触大量数据,在这种情况下网络 转移可能是一个瓶颈。

    参数

    code - JavaScript 函数的字符串表示

    args - 传递给 JavaScript 函数的参数

    所以您没有将 javascript 函数传递给 doEvalmethod。无论如何,你得到的结果与你直接调用 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]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-27
      • 2021-10-07
      • 2019-11-23
      • 1970-01-01
      • 2021-02-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多