$ где в веб-оболочке mongodb не работает

У меня есть приведенный ниже набор тестовых документов, которые я вставил в mongodb, и когда я использую для запроса db с помощью $ where, получите следующее исключение

Ошибка: ошибка базы данных: запрос $ where, но нет скриптового движка

Любая идея, почему предложение $ where не работает

данные испытаний:

db.things.save({ "_id" : 1, "domainName" : "test11.com", "hosting" : "hostgator.com" })
db.things.save({ "_id" : 2, "domainName" : "test2.com", "hosting" : "aws.amazon.com"})
db.things.save({ "_id" : 3, "domainName" : "test3.com", "hosting" : "aws.amazon.com" })
db.things.save({ "_id" : 4, "domainName" : "test4.com", "hosting" : "hostgator.com" })
db.things.save({ "_id" : 5, "domainName" : "test5.com", "hosting" : "aws.amazon.com" })
db.things.save({ "_id" : 6, "domainName" : "test6.com", "hosting" : "cloud.google.com" })
db.things.save({ "_id" : 7, "domainName" : "test7.com", "hosting" : "aws.amazon.com" })
db.things.save({ "_id" : 8, "domainName" : "test8.com", "hosting" : "hostgator.com" })
db.things.save({ "_id" : 9, "domainName" : "test9.com", "hosting" : "cloud.google.com" })
db.things.save({ "_id" : 10, "domainName" : "test10.com", "hosting" : "godaddy.com" })

используемый запрос:

db.things.find ({$ where: "this.domainName == 'test11.com'"});


person Bravo    schedule 03.06.2014    source источник


Ответы (2)


Не используйте оператор $where если в этом нет крайней необходимости. И тогда, пожалуйста, не используйте $where оператор.

Существует лучший способ:

db.things.find({ "domainName": "test11.com" })

Это стандартная форма запроса. Практически никогда не следует использовать $where, и если вы думаете, что да, то разместите свой вопрос здесь, чтобы мы могли вас исправить.

А именно:

  • $where выполняет сравнение JavaScript, которое означает, что для оценки условия создается экземпляр интерпретатора. Это, несомненно, медленнее, чем оценка собственного кода, которая могла бы произойти в противном случае.

  • $where Как указано в документации, отбрасывает возможность проверить оценку условия по индексу из-за преобразования и передачи экземпляру Interpreter. И снова это очень плохо для производительности.

  • Почти всегда есть нативная реализация, которая будет поддерживаться интерфейсом нативного кода, который сделает это и лучше, и быстрее, чем это возможно при вызове интерпретатор JavaScript. Если его сейчас нет, то он будет работать в будущем.

Общий смысл здесь в том, что ваша форма запроса не требуется, так как MongoDB уже делает это родным способом.

Вдобавок, поскольку вы, кажется, имеете в виду «оболочку онлайн-тестирования», со здравым смыслом была активирована опция отключения выполнения JavaScript, доступная для mongod процессов, если иное не реализовано в API, который обрабатывает передачу клиента.

Последнее имеет смысл, чтобы избежать возможных атак с использованием хакеров, но MongoDB обычно (в последних версиях) очень защищен от такой инъекции сценария, поскольку «мог бы» быть в противном случае возможен, если разрешить указание JavaScript в аргументах, доступных для открытой среды.

person Neil Lunn    schedule 03.06.2014
comment
Могу ли я узнать, почему нам нужно избегать $ where, это то, что предоставляется стандартом mongodb только правильно? и, когда я использовал эту форму $, где она не работает, db.things.find ({$ where: function () {return (this.domainName == test11.com)}}); с этим запросом мы ожидаем только один документ (весь тестовый документ, опубликованный в вопросе), но этот запрос предоставляет все документы, могу ли я узнать, почему это предложение $ where ведет себя так? Если у них проблема с $ where, почему mongo не решает эту проблему. - person Bravo; 03.06.2014
comment
@Bravo MongoDB нечего исправить. Это ваше использование неверно. См. Правки, в которых я объясняю это и, в противном случае, объяснение того, почему эта функция не будет раскрыта. - person Neil Lunn; 03.06.2014

Ошибка может возникать из-за того, что на сервере mongodb выполнение JavaScript на стороне сервера могло быть отключено, чтобы проверить это, используйте sh.status ().

Запросы "$ where" не следует использовать без крайней необходимости: они намного медленнее, чем обычные запросы.

Также проверьте эти ссылки, как можно использовать предложение where для внедрения NoSQL.

https://support.mongolab.com/entries/23442437-25-March-2013-Dishibited-server-side-JavaScript-injection

https://www.owasp.org/index.php/Testing_for_NoSQL_injection

person Shahid Hussain    schedule 03.06.2014