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]
Другие вопросы по тегам