1

Groovy 2.3.6、GMongo 1.2、Java 1.8、MongoDB 3.0.0 を使用しています...

doEval()コレクション内のドキュメントの数を取得するために使用しようとしています。doEval()(さまざまな理由で、 ではなく使用したいcount())。1行の文字列引数で呼び出すdoEval()と、1.0のdouble値でretvalが返され、1.0のdouble値で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 の retval を返すことを期待しています。これはバグですか、それとも私の期待は間違っていますか? doEval()複数行の文字列引数をサポートする必要がありますか?

4

1 に答える 1

1

doEval()javadocから:

データベース サーバーで JavaScript 関数を評価します。これは、大量のデータを軽く扱う必要がある場合に役立ちます。この場合、ネットワーク転送がボトルネックになる可能性があります。

パラメータ:

code- JavaScript 関数の文字列表現

args- JavaScript 関数に渡す引数

doEvalしたがって、JavaScript関数をメソッドに渡していません。とにかく、あなたが得ている結果は、mongo シェルを直接呼び出して得ることができる結果と一致しています:

> db.eval("db.configurations.count({name: 'Mike'})");
1
> db.eval("db.configurations.count({\nname: 'Mike'\n})");
null

(私はmongo shell javascript internalsについて深く掘り下げませんでした... :-)

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]
于 2015-04-20T11:10:31.083 に答える