这可以归因于给定数据库的 system.js 集合中的格式错误的条目。我在 system.js 中专门看到的案例是没有“字符串”名称的记录,如下所示:
{ "_id" : ObjectId( "4dee4ee586da7d1330b33d87" ), "value" : 函数 (foo) ...
从 system.js 中删除该记录,您的$where函数应该再次工作。
长答案,或如何重现:
创建一个新的数据库:
> use TempTest
创建一个测试集合:
db.createCollection("myTestCollection")
{“好”:1}
用一些数据填充测试集合:
db.myTestCollection.save({ a : 1 } )
使用$where查询:
db.myTestCollection.find( { $where : "this.a == 1" } )
我们得到了预期的响应: { "_id" : ObjectId("4dee98e26fcbba3e6d0ba2c9"), "a" : 1 }
现在创建 system.js 集合,它存储用于服务器端执行的 js 函数:
db.createCollection("system.js")
{“好”:1}
在 system.js 中插入一条记录,而不指定 _id 的值:
db.system.js.save({ value : "foo" } )
重新运行最后一个查询,这会导致臭名昭著的错误:
db.myTestCollection.find( { $where : "this.a == 1" } )
错误:{“$err”:“名称必须是字符串”,“代码”:10209 }
现在从 system.js 中删除该恶意行:
db.system.js.remove()
再次运行查询,并看到它再次返回预期的响应。
db.myTestCollection.find( { $where : "this.a == 1" } )
{“_id”:ObjectId(“4dee98e26fcbba3e6d0ba2c9”),“a”:1}
希望这对某人有所帮助-今天让我发疯了!