2010-02-17 42 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}

希望這可以幫助別人 - 今天瘋狂開車帶我!

相關問題