doEval() с многострочным строковым аргументом
Использование Groovy 2.3.6, GMongo 1.2, Java 1.8, MongoDB 3.0.0...
Я пытаюсь использовать doEval()
чтобы получить количество документов в коллекции. (По разным причинам я хочу использовать doEval()
скорее, чем count()
). Вызов doEval()
с однострочным строковым аргументом возвращает retval с двойным значением 1.0 и ok с двойным значением 1.0, чего я и ожидаю:
def str = "db.configurations.count({name: 'Mike'})"
database.doEval(str)
Если аргумент находится в нескольких строках, возвращаемое значение равно null (ok равно 1.0).
def str = "db.configurations.count({\nname: 'Mike'\n})"
database.doEval(str)
Я ожидаю, что doEval возвратит значение 1.0, отличное от NULL, как в первом примере. Это ошибка или мои ожидания неверны? Должен doEval()
поддерживать многострочный аргумент строки?
1 ответ
От doEval()
Javadoc:
Оценивает функции JavaScript на сервере базы данных. Это полезно, если вам нужно слегка коснуться большого количества данных, и в этом случае передача по сети может стать узким местом.
Параметры:
code
- Строковое представление функции JavaScript
args
- аргументы для передачи в функцию JavaScript
Таким образом, вы не передаете функцию JavaScript в doEval
метод. В любом случае, полученный вами результат соответствует результату, который вы можете получить, вызывая непосредственно оболочку mongo:
> db.eval("db.configurations.count({name: 'Mike'})");
1
> db.eval("db.configurations.count({\nname: 'Mike'\n})");
null
(Я не копал глубже на внутреннем javascript оболочке mongo...:-)
Передав функцию 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]