1

我一直在尝试将 $where 功能与 Mongo 数据库一起使用,但每次我总是收到相同的错误消息......

$err: name 必须是一个字符串

我实际使用什么类型(字符串 eval、函数等)并不重要——我每次都会收到相同的消息。我什至尝试了他们网站上列出的示例,但仍然有相同的错误消息。

其他查询工作正常 - 只是 $where 函数有此错误。

运行:带有最新 MongoDB 稳定版本的 VirtualBox 上的 Ubuntu

澄清一下,我同时使用 shell 和驱动程序时出现相同的错误。我使用的示例与网站上的示例类似。

(来自 Mongo 网站)

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" ), "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}

希望这对某人有所帮助-今天让我发疯了!

于 2011-06-07T22:04:25.453 回答