2010-01-05 14 views
35

Grup üyelikleri izleyen yerleşik bir belgem var. Yerleştirilen her belgenin, başka bir koleksiyondaki gruba, başlangıç ​​tarihine ve isteğe bağlı son kullanma tarihine işaret eden bir kimliği vardır.MongoDB sorgusu 'veya' koşulu ile

Bir grubun mevcut üyeleri için sorgulamak istiyorum. "Akım", başlangıç ​​zamanının geçerli süreden daha az olduğu ve sona erme süresinin geçerli saatten (VEYA) daha büyük olduğu anlamına gelir.

Bu koşullu sorgu beni tamamen engelliyor. İki sorguyu çalıştırarak ve sonuçları birleştirerek yapabilirdim, ama bu çirkin görünüyor ve bir kerede tüm sonuçlarda yükleme gerektiriyor. Ya da, sürenin dolmasını zaman dilimi için çok uzak bir tarihte yapabilirdim, ama bu daha da çirkin ve potansiyel olarak kırılgan görünüyor. SQL'de sadece “(expires> = Now()) OR ile ifade ediyorum” (ama NULL IS NULL) "- ama Mongo'da bunu nasıl yapacağımı bilmiyorum.

Herhangi bir fikrin var mı? Şimdiden çok teşekkürler. "Bölümünde"

+0

benzer soru: http://stackoverflow.com/questions/1945577 durumunda VEYA açıklamalarda

, bu

SQL benziyor/mantıksal-or-için-iki farklı-alanları-in-sorgular-in-mongodb –

cevap

2

Query objects in Mongo by default AND expressions together. Mongo currently does not include an OR operator for such queries, however there are ways to express such queries.

kullanın ya da "burada".

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

Oldukça serin, ilk kez Mongo ile kullanılan bir işlev görmek !! Dezavantajı, elbette, endeksleri kullanmamasıdır. – Nico

1

o dizinleri kullanamaz çünkü sorgu kısmen yavaş olacak $ kullanımı:

Onun olacak böyle bir şey olabilir. Bu tür bir problem için, doğal olarak her zaman Now() 'dan daha büyük olacak olan "sona erme" alanı için yüksek bir değer depolamanın daha iyi olacağını düşünüyorum. Gelecekte çok yüksek bir tarihte milyonlarca yıl depolayabilir ya da asla belirtmek için ayrı bir tip kullanabilirsiniz. Çapraz tip sıralama sırası http://www.mongodb.org/display/DOCS/Compare+Order+for+Types'da tanımlanmıştır. Boş bir Regex veya MaxKey (eğer dili destekliyorsa) hem iyi seçimlerdir.

33

Birinin yararlı olduğunu düşünürse, www.querymongo.com, OR cümleleri dahil olmak üzere SQL ve MongoDB arasında çeviri yapar. SQL eşdeğerini bildiğinizde sözdizimini bulmak için gerçekten yararlı olabilir.

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

MongoDB:

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