MongoDB с использованием db.things.find ("j! = 3 && k> 10") против db.things.find ({j: {$ ne: 3}, k: {$ gt: 10}}) - PullRequest
0 голосов
/ 25 сентября 2010

Я использую MongoDB, драйвер Ruby и Mongoid, и строки

db.things.find({j: {$ne: 3}, k: {$gt: 10} });

просто кажется таким странным и трудно запоминающимся. Почему бы не использовать парсер:

db.things.find("j != 3 && k > 10")

который может автоматически конвертировать в желаемую форму? (или любой другой формы, которую он использует внутри).

Ответы [ 3 ]

2 голосов
/ 25 сентября 2010

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

DBObject condObj =
   QueryBuilder.start("numberOfPageHits").greaterThan(10)
      .and("name").regex(regExp).get();
1 голос
/ 26 сентября 2010

Взгляните на http://github.com/RedBeard0531/MongoMagic. Он написан на python, но его легко перевести на ruby.Ваш запрос будет выглядеть примерно так:

db.things.find(AND( M.j != 3 , M.k > 10 ))
1 голос
/ 25 сентября 2010

MongoDB поддерживает выражения JavaScript в find() выражениях . Просто знайте, что:

Javascript выполняется медленнее, чем нативные операторы [...], но очень гибок.

Строка выражения JavaScript анализируется один раз в фактический JavaScript, который затем оценивается для каждого документа.

Однако JavaScript не конвертируется в собственные операторы, такие как { $ne: 3 }. Причина этого в том, что не весь JavaScript может быть выражен с использованием собственных операторов .

Поскольку он не может преобразовать выражение в собственные операторы, он (вероятно) также не знает, какие индексы использовать. В результате выражения JavaScript могут быть несколько медленнее, чем собственные операторы.

...