2012-01-14 27 views
11

ile alt belgeleri seçmek için nasıl bir alt belge ile etiketleri gibi bir koleksiyonu var. Ben tüm etiketler (yalnızca) desen kim maç alabilirsiniz Nasıl:MongoDB

db.news.find({"tags":/^proga/i}, ["tags"]).sort({"tags":1}). 
    limit(0).skip(0) 

Sorum şu:

Zaten bir normal ifadeler kullanabilirsiniz ama eşleştirme etiketi içeren tüm haberleri döndüren, burada sorgu ? Ben de belirgin kullanarak çalıştı

(nihai hedef bir otomatik tamamlama alanı yapmaktır), ancak ben, her zaman tüm etiketler :(

beni dönen bir Bul ile ayrı yapmanın bir yolunu bulamadık zaman ayırdığınız için

Teşekkür

cevap

10

Gömülü dokümanlar koleksiyonları olmayan yere sorgu bak.:. db'ye haber .find news koleksiyonundan belgeleri döndürecektir tags bir koleksiyon değil, ve filtre edilemeyen

.. Orada ben bu "sanal koleksiyon özelliği" için bir özellik isteği (SERVER-142), ancak bunu çok yakında görmeyi beklemeyin, çünkü "planlanmış fakat planlanmadı".

İstemci tarafında filtreleme yapabilir veya etiketleri ayrı bir koleksiyona taşıyabilirsiniz. retrieving only a subset of fields - sadece tags alanında - bu oldukça hızlı olmalıdır.

İpucu: İntikamınız, endekslemenin kullanılmasını imkansız kılan /i bayrağını kullanır. Db dizgileriniz normalize edilmeli (ör., Tüm büyük harf)

+0

Cevabınız için teşekkür ederiz, başka bir koleksiyon "etiketleri" yapmaya çalışacağım cadı tüm etiketlerimi içerebilir ve bunun üzerinde filtre yapabilirsiniz (ancak NOSQL şekilde olduğundan emin olmayın) – Mush

13

Partiye biraz geç kalmış, ancak bir çözüm için avlanan diğer kişilere yardımcı olacaktır. Bunu bir araya getirme çerçevesini kullanarak ve $ project ile $ birleştirerek $ match'ı bir araya getirerek birleştirme yolu buldum. Ben PHP kullanarak yaptık ama özü olsun olmalıdır:

$ops = array(
     array('$match' => array(
       'collectionColumn' => 'value', 
      ) 
     ), 
     array('$project' => array(
       'collection.subcollection' => 1 
      ) 
     ), 
     array('$unwind' => '$subCollection'), 
     array('$match' => array(
       subCollection.subColumn => 'subColumnValue' 
      ) 
     ) 
    ); 

ilk maçı ve proje sadece daha hızlı bir şekilde süzmek için kullanıyorsa, o zaman subcollection üzerinde açma öğesi tarafından her subcollection öğeyi tükürür hangi son eşleşme kullanılarak filtrelenebilir.

Bu yardımcı olur umarım. (Ryan Wheale itibaren)

GÜNCELLEME:

yapabilirsiniz o zaman $group veriler tekrar ilk yapısına.

array('$group' => array(
     '_id' => '$_id', 
     'subcollection' => array(
      '$push' => '$subcollection' 
     ) 
    ) 
); 

Ben PHP Düğüm bu tercüme, bu yüzden PHP test etmedim: Daha bir alt belgeyi daha döndüren bir $elemMatch olması gibi. Eğer kimse Düğüm versiyonunu istiyorsa, aşağıda bir yorum bırakın ve mecbur bırakacağım.

+1

Dostum, saf deha.Bunu bulduğumda ampulü patlatamam. Ayrıca öğeleri orijinal yapısına geri bir araya getirebilirsiniz. İlk sonuçtan daha fazla geri dönecek olan 'elemMatch' projeksiyonunun eşdeğerine ihtiyacım vardı. Teşekkürler!! –