0

私は MongoDB をテストしていますが、ちょっと驚いた例を次に示します。

> function compare(a,b) { return (a==b); }

そして、私のコレクションをリストするには:

> db.myCol.find()
{ "_id:" : ObjectId("..."), "name" : "mongo" }
{ "_id:" : ObjectId("..."), "x" : 3 }
{ "_id:" : ObjectId("..."), "name" : "mongo", "notName" : "wow" }

そして - 完全に確実にするために:

> compare('mongo','mongo')
true

そして奇妙な部分:

> db.myCol.find( { $where : "compare(this.name,'mongo')" } )
{ "_id:" : ObjectId("..."), "x" : 3 }
> db.myCol.find( { $where : "this.name=='mongo'" } )
{ "_id:" : ObjectId("..."), "name" : "mongo" }
{ "_id:" : ObjectId("..."), "name" : "mongo", "notName" : "wow" }

クエリには厳密に反対の設定があると思います。

4

2 に答える 2

2

奇妙な結果が得られる理由は、定義した比較関数を実際に実行していないためです。ローカルで定義されましたが、mongodb インスタンスでコマンドをリモートで実行しています。実際に起こっているのは、組み込みの比較が使用されていることです。

> compare
function (l, r) {
    return l == r ? 0 : l < r ? -1 : 1;
}

> compare('mongo', 'mongo')
0

そして、ここにあなたが言うことができる方法があります:

> function compare1(a,b) {return a==b}

> db.myCol.find( { $where : "compare1(this.name,'mongo')" } )
error: {
    "$err" : "error on invocation of $where function:\nJS Error: ReferenceError: compare1 is not defined nofile_a:0",
    "code" : 10071
}

サーバーに関数を保存する方法を説明するサーバー側のコード実行に関するドキュメント ページがあります。ただし、可能な場合はサーバー側の機能を使用しないことも説明しています。

于 2012-05-05T15:32:31.690 に答える
0

$where 演算子を使用した単純なサービス側コードの実行を忘れます。これは低速であり、インデックスを使用せず、実行時にサーバー プロセスをロックダウンするためです。

于 2012-05-05T15:12:06.100 に答える