2012-11-08 24 views
20

मेरे पास मेरे मोंगोडीबी संग्रह में गहरा घोंसला संग्रह है।क्या मोंगोडीबी परिणाम क्वेरी को फ़्लैट करना संभव है?

जब मैं निम्न क्वेरी चलाएँ:

db.countries.findOne({},{'data.country.neighbor.name':1,'_id':0}) 

मैं इस नेस्टेड परिणाम यहाँ के साथ अंत:

{"data" : { 
    "country" : [ 
    { 
     "neighbor" : [ 
     { 
      "name" : "Austria" 
     }, 
     { 
      "name" : "Switzerland" 
     } 
     ] 
    }, 
    { 
     "neighbor" : { 
     "name" : "Malaysia" 
     } 
    }, 
    { 
     "neighbor" : [ 
     { 
      "name" : "Costa Rica" 
     }, 
     { 
      "name" : "Colombia" 
     } 
     ] 
    } 
    ] 
}} 

अब, यह मैं क्या चाहते है:

['Austria', 'Switzerland', 'Malaysia', 'Costa Rica', 'Colombia'] 

या यह:

{'name':['Austria', 'Switzerland', 'Malaysia', 'Costa Rica', 'Colombia']} 

या कुछ और समान ... क्या यह संभव है?

उत्तर

35

आप aggregation ढांचे के $project & $unwind & $group का उपयोग परिणाम आपकी आवश्यकता के साथ नज़दीकी बढ़ाने कर सकते हैं।

> db.countries.aggregate({$project:{a:'$data.country.neighbor.name'}}, 
         {$unwind:'$a'}, 
         {$unwind:'$a'}, 
         {$group:{_id:'a',res:{$addToSet:'$a'}}}) 
    { 
    "result" : [ 
     { 
      "_id" : "a", 
      "res" : [ 
       "Colombia", 
       "Malaysia", 
       "Switzerland", 
       "Costa Rica", 
       "Austria" 
      ] 
     } 
    ], 
    "ok" : 1 
} 

$unwind नाम सरणी के बाद से दो बार इस्तेमाल किया गहरी नीडिंत है। और यह केवल तभी काम करेगा यदि neighbor विशेषता एक सरणी है। आपके उदाहरण में एक पड़ोसी क्षेत्र (मलेशिया) एक सरणी नहीं है

+0

धन्यवाद! ': मैं हालांकि निम्नलिखित हो रही है {" परिणाम ": []," ठीक है ": 1}':/ – Gevorg

+0

@Gevorg, जवाब अपडेट किया गया। कृपया – RameshVel

+0

दिलचस्प देखें। यह अभी भी बहुत सारे काम की तरह लगता है लेकिन मुझे लगता है कि मुझे इसका उपयोग करना होगा। धन्यवाद – Gevorg

0

यह aggregation framework के तहत बहुत सरल है। $ परियोजना और $ अनइंड ऑपरेशन उद्देश्य के लिए सही हैं।