1

Mongo データベースで $where 機能を使用しようとしましたが、毎回同じエラー メッセージが表示されます...

$err: 名前は文字列でなければなりません

実際に使用するタイプ (文字列 eval、関数など) は関係ありません。毎回同じメッセージが表示されます。彼らのウェブサイトにリストされている例を試してみても、同じエラーメッセージが表示されます.

他のクエリは問題なく動作します。このエラーが発生するのは $where 関数だけです。

実行中: 最新の MongoDB 安定版リリースを使用した VirtualBox 上の Ubuntu

明確にするために、シェルとドライバーの両方を同じエラーで使用しています。ウェブサイトにあるものと同様の例を使用しています。

(モンゴのサイトより)

db.myCollection.find( { $where: "this.a > 3" });
db.myCollection.find( "this.a > 3" );
db.myCollection.find( { $where: function() { return this.a > 3;}});
4

1 に答える 1

1

これは、特定のデータベースの 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 }

これが誰かの役に立てば幸いです - 今日は私を夢中にさせました!

于 2011-06-07T22:04:25.453 に答える