まず、$where
ここで説明されている理由から、演算子を使用することはほとんどありません(クレジットは@WiredPrairieに送られます)。
問題に戻ると、採用したいアプローチは、mongodbシェル($where
で裸のjs関数を明示的に許可する)でも機能しません。 オペレーター)。 $where
に提供されるJavaScriptコード 演算子はmongoサーバーで実行され、囲んでいる環境(「コンテキストバインディング」)にアクセスできません。
> db.test.insert({a: 42})
> db.test.find({a: 42})
{ "_id" : ObjectId("5150433c73f604984a7dff91"), "a" : 42 }
> db.test.find({$where: function() { return this.a == 42 }}) // works
{ "_id" : ObjectId("5150433c73f604984a7dff91"), "a" : 42 }
> var local_var = 42
> db.test.find({$where: function() { return this.a == local_var }})
error: {
"$err" : "error on invocation of $where function:\nJS Error: ReferenceError: local_var is not defined nofile_b:1",
"code" : 10071
}
さらに、node.jsネイティブmongoドライバーは、クエリオブジェクトで提供するjs関数を自動的にシリアル化せず、代わりに句を完全に削除するという点で、シェルとは異なる動作をするように見えます。これにより、timetables.find({})
に相当するものが残ります。 コレクション内のすべてのドキュメントが返されます。