2010-09-19 22 views
11

Şunun gibi bir ayar varsayarsak:MongoDB: çapraz koleksiyon sorguları

Belirli bir etikete sahip tüm blog gönderilerini alabildiğimi biliyorum:

$cursor = $blogposts->find(array('tags' => 'bar')); 

Ancak, bir kerede birden fazla tahsilatı sorgulamak için herhangi bir yol var mı etiketli tüm belgeler Örneğin. tüm içeriği 'bar' etiketiyle göstermek için

cevap

13

Aynı anda birden çok koleksiyon sorgulamak için bir yolu yoktur.

En iyi yaklaşım, belgelerin tümü aynı genel türse, tüm belgeleri aynı koleksiyonda saklamak olacaktır. Örneğinizde, hem blog gönderileri hem de haber öğeleri bir tür içeriktir.

content 
{ 
    type: "blogpost", 
    title: "Example", 
    slug: "example-post" 
    tags: ["foo", "bar"] 
}, 
{ 
    type: "blogpost", 
    title: "Example2", 
    slug: "example2" 
    tags: ["foo"] 
}, 
{ 
    type: "news", 
    headline: "Test" 
    slug: "test-news" 
    tags: ["bar"] 
} 

Bu yaklaşım, MongoDB'nin şema yapısı dışındaki özelliklerinden yararlanır; Her iki belge türü farklı özelliklere sahip olsa da, hepsi aynı koleksiyonda saklanabilir. Bu, gereksinimlerinize bağlı olarak içeriğinizin tamamını veya yalnızca içeriğin türlerini sorgulamanızı sağlar.

+0

+1. Koleksiyonumun içinde iki sütun indekslemeyi planladığımda tek bir koleksiyon üzerinde birden çok koleksiyon kullanmam durumunda performans farkı olacak mı? – Legend

+0

@Legend: Teşekkürler! Birden fazla koleksiyon kullanarak, size biraz RAM kazandıracak 'type 'alanını dizine eklemeniz gerekmeyecek. Ancak, sorgu performansı açısından, doğru endeksleri tanımladıysanız farklar göz ardı edilebilir olacaktır. –

0

Mongodb 3.2'den bu yana, başka bir koleksiyona "katılmanıza" olanak sağlayan bir toplama hattındaki $ lookup aşamasını kullanmak artık mümkün.

bir sol dış işlenmesi için toplama “birleştirilmiş” belgelerinde filtre aynı veritabanında bir unsharded koleksiyonuna birleştirme gerçekleştirir. $ Lookup stage alanı, “join” koleksiyonundaki belgelerin bulunduğu alandaki giriş belgelerinden alanı arasında bir eşitlik eşleşmesi yapar. büyük fikir için

Source