これは、特定のデータベースの system.js コレクション内の不正な形式のエントリが原因である可能性があります。特に system.js で見たケースは、次のような「文字列」名のないレコードです。
{ "_id" : ObjectId( "4dee4ee586da7d1330b33d87" ), "値" : 関数 (foo) ...
system.js からそのレコードを削除すると、$where関数が再び機能するはずです。
長い答え、またはこれを再現する方法:
新しいデータベースを作成します。
> use TempTest
テスト コレクションを作成します。
デシベル.createCollection("myTestCollection")
{「わかりました」: 1}
テスト コレクションにいくつかのデータを入力します。
デシベル.myTestCollection.save( { a : 1 } )
$whereを使用したクエリ:
db.myTestCollection.find( { $where : "this.a == 1" } )
期待される応答を取得します: { "_id" : ObjectId("4dee98e26fcbba3e6d0ba2c9"), "a" : 1 }
次に、サーバー側で実行するための js 関数を格納する system.js コレクションを作成します。
db.createCollection("system.js")
{「わかりました」: 1}
_id の値を指定せずに、system.js にレコードを挿入します。
db.system.js.save( { 値 : "foo" } )
最後のクエリを再実行すると、悪名高いエラーが発生します。
db.myTestCollection.find( { $where : "this.a == 1" } )
エラー: { "$err": "名前は文字列でなければなりません", "コード": 10209 }
system.js から不正な行を削除します。
デシベル.システム.js.削除()
クエリを再度実行し、期待される応答が再び返されることを確認します。
db.myTestCollection.find( { $where : "this.a == 1" } )
{ "_id": ObjectId("4dee98e26fcbba3e6d0ba2c9"), "a": 1 }
これが誰かの役に立てば幸いです - 今日は私を夢中にさせました!