MongoDB: '$ err: name должно быть строкой' с $ where - PullRequest
0 голосов
/ 18 февраля 2010

Я пытался использовать функциональность $ where с базой данных Mongo, но я всегда получаю одно и то же сообщение об ошибке каждый раз ...

$ err: имя должно быть строкой

Не имеет значения, какой тип я на самом деле использую (строка eval, function и т. Д.) - я получаю одно и то же сообщение каждый раз Я даже дошел до того, что попробовал примеры, перечисленные на их веб-сайте, и все еще имею то же сообщение об ошибке.

Другие запросы работают нормально - эта ошибка есть только у функции $ where.

Работает: Ubuntu на VirtualBox с последней стабильной версией MongoDB

Чтобы уточнить, я использую и оболочку, и драйверы с одной и той же ошибкой. Я использую примеры, аналогичные тем, которые можно найти на сайте.

(с сайта Mongo)

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

1 Ответ

1 голос
/ 08 июня 2011

Это может быть связано с неправильной записью в коллекции system.js для данной базы данных. Случай, который я видел в system.js, представляет собой запись без «строкового» имени, например:

{"_id": ObjectId ("4dee4ee586da7d1330b33d87"), "значение": функция (foo) ...

Удалите эту запись из system.js и ваши $, где функции должны снова работать.

ДЛИННЫЙ ответ, или как воспроизвести это:

Создать новую базу данных:

> use TempTest 

Создание тестовой коллекции:

db.createCollection ( "myTestCollection")

{"ок": 1}

Заполните тестовую коллекцию некоторыми данными:

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

Запрос с использованием $, где :

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 ({значение: "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}

Надеюсь, это кому-то поможет - сегодня это сводило меня с ума!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...