2010-02-17 22 views
0

我一直在尝试使用Mongo数据库中的$ where功能,但每次都会收到相同的错误消息...

$错误:名称必须是一个字符串

不要紧,我实际使用何种类型(字符串的eval,功能等) - 每一次我得到了同样的信息。我甚至去尝试在他们的网站上列出的例子,仍然有相同的错误信息。

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

运行:Ubuntu的VirtualBox上使用MongoDB的最新稳定版本

要澄清,我同时使用shell,并用同样的错误的驱动程序。我使用的例子与网站上的类似。

(从蒙戈网站)

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

这是来自shell还是使用驱动程序?你可以发布你的失败代码? – 2010-02-17 22:00:40

+0

另外FWIW我们倾向于在mongodb用户列表上而不是在这里反应更快 - 所以未来可能会有更多的运气发布。 – mdirolf 2010-02-17 22:31:57

回答

1

这可以归因于system.js集合在给定的数据库格式错误的条目。我在system.js中具体看到的情况是没有“字符串”名称的记录,如下所示:

{“_id”:ObjectId(“4dee4ee586da7d1330b33d87”),“value”:function(foo)..

从system.js和$中删除该记录,其中函数应该再次运行。

长的答案,或者如何重现此:

创建一个新的数据库:

> use TempTest 

创建一个测试集合:

db.createCollection("myTestCollection")

{ “OK”:1}

用一些数据填充测试集合:

db.myTestCollection.save({ a : 1 })

使用查询$其中

db.myTestCollection.find({ $where : "this.a == 1" })

我们得到预期的响应:{ “_id”:物件( “4dee98e26fcbba3e6d0ba2c9”), “一”:1}

现在创建的system.js集合,它存储JS用于服务器端执行的功能:

db.createCollection("system.js")

{ “OK”:1}

将记录插入系统。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”:物件( “4dee98e26fcbba3e6d0ba2c9”), “一”:1}

希望这可以帮助别人 - 今天疯狂开车带我!

相关问题