2012-01-14 16 views
11

साथ सहायक दस्तावेज़ों को चुनने के लिए मैं कैसे टैग की तरह एक subdocument के साथ एक संग्रह है।MongoDB

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

मेरा प्रश्न है:

मैं पहले से ही एक regex का उपयोग लेकिन यह सब मिलान टैग वाले खबर देता है, यहाँ प्रश्न है मैं सभी टैग (केवल) जो आकार से मिलान कैसे प्राप्त कर सकते हैं ?

मैं भी अलग उपयोग करने की कोशिश (अंतिम लक्ष्य एक स्वत: पूर्ण क्षेत्र बनाने के लिए है), लेकिन मैं, यह मुझे हमेशा सभी टैग :(

लौटने एक खोज के साथ एक अलग बनाने के लिए एक तरह से नहीं मिला

अपने समय के लिए धन्यवाद

उत्तर

10

एंबेडेड दस्तावेजों संग्रह नहीं कर रहे हैं पर आपकी क्वेरी देखो:।। db खबर .find news संग्रह से दस्तावेजों वापस आ जाएगी tags एक संग्रह नहीं है, और फिल्टर नहीं किया जा सकता है

।। वहां मैं इस "आभासी संग्रह सुविधा" (SERVER-142) के लिए एक फीचर अनुरोध है, लेकिन इसे जल्द से जल्द देखने की उम्मीद न करें, क्योंकि यह "योजनाबद्ध है लेकिन निर्धारित नहीं है"।

आप फ़िल्टरिंग क्लाइंट-साइड कर सकते हैं, या टैग को एक अलग संग्रह में ले जा सकते हैं। retrieving only a subset of fields द्वारा - केवल tags फ़ील्ड - यह उचित रूप से तेज़ होना चाहिए।

संकेत: आपका रेगेक्स /i ध्वज का उपयोग करता है, जो अनुक्रमण का उपयोग करना असंभव बनाता है। आपके डीबी स्ट्रिंग्स केस-सामान्यीकृत (उदा। सभी ऊपरी मामले)

+0

उत्तर के लिए धन्यवाद, मैं एक और संग्रह बनाने की कोशिश करूंगा "टैग" चुड़ैल में मेरे सभी टैग हो सकते हैं और इस पर फ़िल्टर कर सकते हैं (लेकिन यह सुनिश्चित न करें कि यह एनओएसक्यूएल तरीके से है) – Mush

13

पार्टी के लिए थोड़ा देर होनी चाहिए, लेकिन उम्मीद है कि समाधान के लिए शिकार करने वाले अन्य लोगों की मदद मिलेगी। मुझे समेकन ढांचे का उपयोग करके और $ परियोजना के साथ $ $ को अनदेखा करके, उन्हें एक साथ जोड़कर ऐसा करने का एक तरीका मिला है। मैं PHP का उपयोग कर इसे किया है, लेकिन आप सार मिलना चाहिए:

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

पहला मैच और इस परियोजना सिर्फ बाहर फिल्टर करने के लिए यह तेजी से बनाने के लिए उपयोग कर रहे हैं, तो subcollection पर तनाव मुक्त बाहर प्रत्येक subcollection आइटम आइटम द्वारा थूक जो फिर अंतिम मैच का उपयोग करके फ़िल्टर किया जा सकता है।

उम्मीद है कि मदद करता है।

(रयान Wheale से) अद्यतन:

फिर आप $group डेटा अपनी मूल संरचना में। यह एक $elemMatch जो एक subdocument की तुलना में अधिक रिटर्न होने की तरह है:

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

मैं PHP के लिए नोड से अनुवाद, तो मैं PHP में परीक्षण नहीं किया। अगर कोई नोड संस्करण चाहता है, तो नीचे एक टिप्पणी छोड़ दो और मैं स्वीकार करूंगा।

+1

दोस्त, शुद्ध प्रतिभा।जब मुझे यह पता चला तो मैं लाइटबुल को उड़ा नहीं सकता। आप वस्तुओं को उनकी मूल संरचना में एक साथ वापस $ $ समूह भी कर सकते हैं। मुझे '$ elemMatch' प्रक्षेपण के बराबर की आवश्यकता थी जो पहले परिणाम से अधिक वापस आ जाएगा। धन्यवाद!! –