2010-10-04 19 views
5

Bazı kayıtları iade etmek için "A VEYA B VEYA (C VE D)" formunun bir MongoDB sorgusu yazmam gerekiyor. Modellerimize veri erişimi için Mongoid kullanıyoruz. Mongoid ile "(A VEYA B) VE (A VEYA C)" sorgularını nasıl yazıyorsunuz?

Bunun için sorguyu "(A veya B veya C) VE (A veya B veya D)" genişletilmiş ve böyle Mongoid Ölçüt yöntemini any_of kullanılarak umuyordum: Model.any_of(A, B, C).any_of(A, B, D) İstediğimi başarmak, ama bu şekilde genişletilir Veritabanına gönderilmeden önce "A VEYA B VEYA C VEYA A VEYA B VEYA D".

Bu sorguyu oluşturmanın bir yolu var mı, yoksa A VEYA B ve C ve D yapmak için bir sorgu oluşturmak ve bunların birliğini almak zorunda mıyım?

cevap

0

Kontrol bu bağlantıyı, size yardımcı olabilecek umut -

http://mongoid.org/docs/querying/

Muhtemelen mümkünse siz ".any_in" ve ".ve" birleştirmek ve kontrol edebilirsiniz.

0

Bu mongo'da bir hata gibi görünüyor, ancak mongo sorunlarının bildirildiği/izlendiği yerlerde zor bir zaman geçiriyorum.

> db.things.insert({x : 1, y: 2}); 
> db.things.insert({x : 2, y: 3}); 
> db.things.insert({x : 3, y: 4}); 
> db.things.find({ $or : [{x:1,x:2}], $or : [{y:1,y:2}] }); 
{ ..., "x" : 1, "y" : 2 } 
{ ..., "x" : 2, "y" : 3 } 
+1

Çoklu '$ or' ifadeleri:

Model.any_of({a: 1}, {b: 1}, {c: 1, d: 1}) 

Bu gibi bir sorgu üretecektir hiçbir anlam ifade etmeyin. Bir BSON nesnesine dönüştürüldüğünde bunun ne olacağını düşünün. İkincisi, eskiyi geçersiz kılacaktır. Ek olarak, seçici belgeleriniz aynı başarısızlıktan suçludur; temelde '$ veya: [{y: 2}]' yi arıyorsun. –

+0

Çoklu '$ or' ifadeleri mükemmel bir anlam ifade ediyor, görünüşe göre mongo tarafından desteklenmiyorlar (bunu doğrulamak için bir bağlantı var mı, btw?). En iyi uygulama, '(A VEYA B) VE (A VEYA C) 'biçimini,' $ veya 'kullanmak için' A VEYA (B VE C) 'gibi ayırmalara manuel olarak dönüştürmek, çünkü mongoid Bunu bizim için yapmayacaksın. –

+0

Bool mantık anlamında mantıklıdır, ancak yinelenen anahtarlara izin vermeyen JSON Nesne anlamında değildir. DNF'nin sorguyu ifade etmenin doğru yolu olduğundan emin misiniz? –

3

(Düzenleme: Sadece bu soru 3 yaşında fark sadece geldi neden hiçbir fikrim yok..)

Böyle bir şey istiyorum:

Model.any_of(a, b, c) 

a , b ve c, seçici belgelerdir (bu, unutmayın, birden çok deyim ile ANDE olduğunu).

Örneğin, sorguları ise:

{a: 1} 
{b: 1} 
{c: 1, d: 1} 

Sonra istersek:

models.find({$or: [{a: 1}, {b: 1}, {c: 1, d: 1}]}) 
+0

Bu soruya iyi bir cevap vermeden iyi bir soru olduğu için bu konuda bir ödül başlattım. – Andrew

+0

Aha, anladım. Umarım benimki tatmin edicidir. :) –

+0

'any_of' size (A VEYA B) VE (A VEYA C)' yi nasıl verir? –

İlgili konular