Запрос MongoDB с условием «или»

Поэтому у меня есть встроенный документ, который отслеживает членство в группах. Каждый встроенный документ имеет идентификатор, указывающий на группу в другой коллекции, дату начала и дополнительную дату истечения срока действия.

Я хочу запросить для текущих членов группы. «Ток» означает, что время начала меньше текущего времени, а время истечения превышает текущее время ИЛИ null.

Этот условный запрос полностью блокирует меня. Я мог бы сделать это, выполнив два запроса и объединив результаты, но это кажется уродливым и требует загрузки во всех результатах сразу. Или я мог бы по умолчанию истекать время до какой-то произвольной даты в далеком будущем, но это кажется еще более уродливым и потенциально хрупким. В SQL я бы просто выразил это с помощью «(expires> = Now ()) OR (истекает IS NULL)» – но я не знаю, как это сделать в Mongo.

Есть идеи? Большое спасибо заранее.

Просто подумал, что я обновляю в случае, если кто-нибудь наткнется на эту страницу в будущем. Начиная с 1.5.3, монго теперь поддерживает реальный $ или оператор: http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24or

Ваш запрос “(expires> = Now ()) ИЛИ (истекает IS NULL)” теперь можно отобразить как:

{$or: [{expires: {$gte: new Date()}}, {expires: null}]} 

В случае, если кто-либо считает это полезным, http://www.querymongo.com делает перевод между SQL и MongoDB, включая предложения OR. Это может быть очень полезно для определения синтаксиса, когда вы знаете эквивалент SQL.

В случае операторов OR это выглядит так:

SQL:

 SELECT * FROM collection WHERE columnA = 3 OR columnB = 'string'; 

MongoDB:

 db.collection.find({ "$or": [{ "columnA": 3 }, { "columnB": "string" }] }); 

Объекты запроса в Mongo по умолчанию и выражения вместе. В настоящее время Mongo не включает оператор OR для таких запросов, однако есть способы выразить такие запросы.

Используйте «in» или «where».

Это будет что-то вроде этого:

 db.mycollection.find( { $where : function() { return ( this.startTime < Now() && this.expireTime > Now() || this.expireTime == null ); } } ); 

Использование запроса $ where будет медленным, отчасти потому, что он не может использовать индексы. Для такого рода проблем я думаю, что было бы лучше сохранить высокое значение для поля «expires», которое, естественно, всегда будет больше, чем Now (). Вы можете либо хранить очень высокую дату в миллионы лет в будущем, либо использовать тип «seporate», чтобы никогда не указывать. Порядок сортировки кросс-типа определяется по адресу http://www.mongodb.org/display/DOCS/Compare+Order+for+Types . Пустое Regex или MaxKey (если вы его поддерживаете) являются хорошим выбором.

  • Model.find (). ToArray () утверждает, что не имеет метода .toArray ()
  • MongoDB не может запустить сервер: механизм хранения по умолчанию «wiredTiger» недоступен в этой сборке mongod
  • Могут ли mongo обновить данные массива?
  • Работа со специальными персонажами в коллекции Монго
  • MongoDB select count (different x) в индексированном столбце - подсчет уникальных результатов для больших наборов данных
  • MongoDB: вспомогательный субподряд
  • Как защитить MongoDB с именем пользователя и паролем
  • mongo - не удалось подключиться к серверу 127.0.0.1:27017
  • TypeError: db.collection не является функцией
  • MongoDB - пользователь admin не авторизовался
  • Какие символы НЕ допускаются в именах полей MongoDB?
  • Interesting Posts

    Как отключить чернила PGBK на принтере Canon и использовать BK для черного?

    Изменение ViewPager для включения бесконечной прокрутки страницы

    Усечение длинных строк с помощью CSS: возможно?

    Использовать fragment / активность внешнего приложения внутри приложения

    Как я могу получить список стека вызовов в Perl?

    Должен ли я использовать android: process = “: remote” в моем приемнике?

    Поиск в Firebase без кода на стороне сервера

    Что означают значения «+ n» в конце имени метода в трассировке стека?

    Загружать файл Scala в интерпретатор для использования функций?

    Порядок выполнения документа jquery готов

    Как обнаружить события click / touch в пользовательском интерфейсе и GameObjects

    jQuery datepicker – 2 ввода / текстовые поля и ограничивающий диапазон

    Как доказать, что провайдер блокирует входящий трафик на некоторых портах?

    Как запретить пользователям sudo запускать определенные команды?

    Каковы некоторые опции для переноса больших файлов без использования Интернета?

    Давайте будем гением компьютера.