Mongodb выражения JavaScript и $ где - PullRequest
0 голосов
/ 16 января 2012

Существуют ли какие-либо воздействия на производительность при использовании выражений javascript внутри запроса mongodb вместо стандартной нотации BSON. Например:

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

Будет ли первый запрос быстрее второго, если в столбце нет индекса? Также есть ли способ написать запрос

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

или

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

без использования обозначения $ where?

Ответы [ 3 ]

2 голосов
/ 16 января 2012

Будет ли первый запрос быстрее второго, если в столбце нет индекса?

В обоих случаях первое включение в основном всегда будет быстрее. Предложение $where будет использовать движок javascript. Может быть только один движок javascript, работающий на экземпляр, поэтому может потребоваться подождать. Кроме того, предложение $where должно будет перемещать объекты в и из виртуальной машины javascript, что увеличивает накладные расходы и будет медленнее.

Кроме того, есть ли способ написать запрос ... .find( { $where: "this.a / this.b > 3" } ); без использования обозначения $ where?

Ответ здесь нет . Механизм запросов не поддерживает какой-либо запрос при сравнении данных внутри объекта. Единственные обходные пути здесь:

  1. Предварительно вычислить столбец (, который, я уверен, вы пытаетесь избежать )
  2. Запустите цикл for где-нибудь и сделайте это «вручную». Это можно сделать с помощью Map / Reduce или запроса на стороне клиента.

Конечно, оба решения являются неоптимальными. Это определенно единая функциональность MongoDB.

2 голосов
/ 16 января 2012

отсюда:

http://www.mongodb.org/display/DOCS/Server-side+Code+Execution#Server-sideCodeExecution-%7B%7B%24where%7D%7DClausesandFunctionsinQueries

"Примечание: если возможно нормальное управляемое данными выражение запроса BSON, используйте эту конструкцию. Используйте $ where, только если это необходимо, оно значительно медленнее."

На ваш второй вопрос: вы можете сделать

{ a : { $gt: 0.3 } }
0 голосов
/ 16 января 2012

"Javascript выполняется медленнее, чем собственные операторы, перечисленные на этой странице, но очень гибок. Для получения дополнительной информации см. Страницу обработки на стороне сервера."

Для получения более подробной информации смотрите следующее: http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-JavascriptExpressionsand%7B%7B%24where%7D%7D

...