2017-03-14 10 views
7

मैं अपने taxon संग्रह में निम्न स्कीमा है:MongoDB पुनरावर्ती पूछताछ

{ 
    "_id": 1, 
    "na": [ "root_1", 
     "root_2", 
     "root_3" ], 
    "pa": 1 
},{ 
    "_id": 2, 
    "na": [ "name_1", 
     "name_2", 
     "name_3"], 
    "pa": 1 
},{ 
    "_id": 4, 
    "na": [ "otherName_1", 
     "otherName_2", 
     "otherName_3"], 
    "pa": 2 
} 

प्रत्येक दस्तावेज़ जनक क्षेत्र है, जो _id के अनुरूप की यह माता पिता है द्वारा दूसरे से जुड़े हुए है।

मैं निम्नलिखित परिणाम प्राप्त करने के लिए एक पुनरावर्ती खोज करने के लिए करना चाहते हैं:

{ "_id": 4, 
    "nameList": [ "otherName_1", 
       "name_1", 
       "root_1"] 
} 

एक निश्चित _id साथ दस्तावेज़ से, _id: 1 साथ दस्तावेज़ जब तक हर माता-पिता की na सरणी के पहले आइटम मिल

मुझे वर्तमान में एक्स प्रश्नों (मूल दस्तावेज द्वारा एक, उदाहरण के लिए 3) करके यह परिणाम मिलता है, लेकिन मुझे पूरा यकीन है कि यह एक क्यू का उपयोग करके हासिल किया जा सकता है uery। मैंने पहले ही $graphLookup ऑपरेटर को देखा है, लेकिन इसके साथ अपना रास्ता नहीं मिल सका ...

क्या यह मोंगोडीबी 3.4.1 का उपयोग कर एक ही प्रश्न में इसे हासिल करना संभव है?

संपादित

मैं 50 दस्तावेजों प्रत्येक समय के लिए इस चलाने होगा, इसलिए इष्टतम समाधान किसी एक क्वेरी

उदाहरण के लिए

में सब कुछ गठबंधन करने के लिए हो सकता है, यह होगा

var listId = [ 4, 128, 553, 2728, ...]; 
var cursor = db.taxon.aggregate([ 
    {$match: 
    { _id: {$in: listId}} 
    }, ... 
)]; 
तरह लग रहा है

और आउटपुट:

[{ "_id": 4, 
    "nameList": [ "otherName_1", 
       "name_1", 
       "root_1"] 
}, { "_id": 128, 
    "nameList": [ "some_other_ame_1", 
       "some_name_1", 
       "root_1"] 
}, { "_id": 553, 
    "nameList": [ "last_other_ame_1", 
       "last_name_1", 
       "root_1"] 
} ... ] 

उत्तर

4

आप एकत्रीकरण से नीचे आज़मा सकते हैं।

चरण $match - $graphLookup - $project

$reduce$graphLookupnameList'sna सरणी से प्रत्येक तत्व को चुनने के लिए $reduce

db.taxon.aggregate([{ 
    $match: { 
     _id: { 
      $in: listId 
     } 
    } 
}, { 
    $graphLookup: { 
     from: "taxon", 
     startWith: "$_id", 
     connectFromField: "pa", 
     connectToField: "_id", 
     as: "nameList" 
    } 
}, { 
    $project: { 
     nameList: { 
      $reduce: { 
       input: "$nameList", 
       initialValue: [], 
       in: { 
        "$concatArrays": ["$$value", { 
         $slice: ["$$this.na", 1] 
        }] 
       } 
      } 
     } 
    } 
}]) 
+0

यह एक बहुत अच्छा समाधान है, बहुत बहुत धन्यवाद! क्या एक ही समय में कई दस्तावेजों के लिए यह संभव होगा? (विवरण के लिए मेरा संपादन देखें) – felix

+0

आपका स्वागत है। अद्यतन उत्तर यह किसी भी मिलान की स्थिति के साथ काम करना चाहिए। – Veeram

+0

ठीक है मेरी बुरा मैंने $ के साथ कोशिश की लेकिन कर्सर पर फिर से शुरू करना भूल गया ... यह वही है जो मुझे चाहिए, वास्तविक लाभ देखने के लिए बस कुछ प्रदर्शन परीक्षण चलाने की आवश्यकता है! क्या आपके पास ऐसी क्वेरी के लिए इंडेक्स पर कोई सलाह है? – felix

संबंधित मुद्दे