2012-04-30 3 views
1

Что такое правильный синтаксис в MongoDB, чтобы вернуть все запросы, которые удовлетворяют следующим критериям:Оператор Mod в MongoDB

a % 4 >= 2 

Я попытался с помощью следующей команды, но он возвращает пустой

db.data.find({ a : { $mod : [ 4, { $gte : 2 } ] } }); 

Другой вариант будет использовать выражение Javascript следующим образом:

db.data.find("this.a % 4 >= 2"); 

Javascript выражение работает и возвращается ожидаемые документы, но это не работает из PyMongo.

MongoDB версия 2.0.4
PyMongo версия 2.1.1

+0

a% 4> = 3 эквивалентно более эффективному% 4 == 3. Невозможно, чтобы% 4 было> 3. – Corbin

+0

Хорошо, неудачно, я применил пример выше к% 4> = 2 – carbotex

+0

Просто curios: для чего вы используете запрос? Лично мне никогда не нужен $ mod. Поэтому я хотел бы знать, для чего он используется. – rwitzel

ответ

1

Я не думаю, что вы можете сделать это в настоящее время с помощью простого запроса, и вместо этого вам придется использовать вашу версию javascript. Вы должны иметь возможность сделать это с помощью PyMongo с помощью метода where для созданного курсора. F.e .:

cursor = collection.find().where("this.a % 4 >= 2"); 
+0

Я надеюсь, что MongoDB обеспечит поддержку побитовой операции в будущем, но эта работа будет действовать на данный момент. Спасибо, это работает. – carbotex

+0

MongoDB поддерживает простые побитовые операторы для модификации. Для запросов ответ на https://jira.mongodb.org/browse/SERVER-3518 – Derick

3

Чтобы использовать где выражение в PyMongo, попробуйте следующее: { $where: "this.a % 4 >= 2" }

Оператор $mod просто не работает с условными, как это. У вас есть три варианта:

  1. Используйте где выражение
  2. Используйте выражение, подобные этим:

    db.data.find({ $or : [ { a : { $mod : [ 4, 2 ] } }, 
             { a : { $mod : [ 4, 3 ] } } 
             ] }); 
    
    db.data.find({ $and : [ { a : { $not : { $mod : [ 4, 0 ] } } }, 
             { a : { $not : { $mod : [ 4, 1 ] } } } 
             ] }); 
    
  3. Магазин a % 4 в своей области.

+0

Ответ на '$ или 'выше - лучший, если числа малы, потому что это не связано с оценкой Javascript. – Tobia