2012-04-18 13 views
6

मान लीजिए कि मैं संस्थाओं एक, बी और सी में एक ही प्रकार के सभी चलाते हैं और स्थिति इस तरह है:मैं केवल प्रत्यक्ष वंशजों के लिए कैसे पूछ सकता हूं?

इकाई एक के लिए इकाई ख इकाई ख माता-पिता मूल इकाई ग के लिए

अब अगर है मैं निम्नलिखित प्रश्न

query = ndb.Query(ancestor=a.key) 
result = query.fetch() 

परिणाम में बी और सी दोनों इकाइयां होंगी। क्या कोई तरीका है कि मैं सी को फ़िल्टर कर सकता हूं ताकि केवल उन्हीं संस्थाएं जो प्रत्यक्ष वंशज हैं? मेरे द्वारा परिणामों के माध्यम से जाने और उन्हें हटाने का कोई मतलब नहीं है मेरा मतलब है।

उत्तर

4

ऐसा करने का एकमात्र तरीका आपकी स्कीमा को संशोधित करना है, एक 'पैरेंट' KeyProperty जो किसी इकाई के प्रत्यक्ष माता-पिता का संदर्भ देता है, फिर उस पर फ़िल्टर करना।

+4

भी ध्यान रखें कि पूर्वज क्वेरी के परिणाम वास्तव में भी शामिल होंगे एक (यह मानते हुए वे सभी एक ही तरह का है)। आप प्रत्येक इकाई में 'स्तर' संपत्ति भी प्राप्त कर सकते हैं जहां रूट के स्तर 0 है, इसके प्रत्यक्ष बच्चों के स्तर 1, उनके बच्चों का स्तर 2, और ओ है। –

1

वास्तव में, यह बिल्कुल समर्थित नहीं है। निक का जवाब काम करता है, लेकिन केवल तभी जब आप अपनी क्वेरी में इकाई प्रकार निर्दिष्ट कर सकते हैं जिसे ओपी ने निर्दिष्ट नहीं किया था:

"दयालु प्रश्नों में गुणों पर फ़िल्टर शामिल नहीं हो सकते हैं। हालांकि, वे Entity.KEY_RESERVED_PROPERTY पास करके इकाई कुंजी द्वारा फ़िल्टर कर सकते हैं। फ़िल्टर के लिए संपत्ति का नाम के रूप में। Entity.KEY_RESERVED_PROPERTY पर आरोही प्रकार भी समर्थित हैं। "

+0

मैं निक के उत्तर का उपयोग कर रहा हूं और यह ठीक काम करता है। हालांकि मुझे पॉली मॉडल में जाना पड़ा। – sorin7486

+0

@ sorin7486 तो, क्या आप कह रहे हैं कि आप एक पूर्वजों की क्वेरी करने में सफल रहे हैं जिसमें एक फ़िल्टर शामिल है लेकिन इसमें शामिल नहीं है? – moin

+0

इसमें एक तरह का होता है, बस यह कि मूल प्रकार है। मेरी सभी वस्तुएं विभिन्न प्रकार के पेज हैं और वे सभी एक पृष्ठ वर्ग का विस्तार करते हैं। – sorin7486

0

यह थोड़ा देर हो चुकी है, हालांकि यह किसी भी समस्या के साथ किसी की भी मदद करेगी।

समाधान सबसे पहले कुंजी-केवल क्वेरी करना है और उन कुंजीों का सबसेट लेना जो सीधे वंशज हैं।

कुंजी के उस सबसेट के साथ, आप वांछित इकाइयों को बैच कर सकते हैं।

मैं अजगर के साथ अपरिचित हूँ, इसलिए यहां बार में एक उदाहरण है:

directDescKeys := make([]*datastore.Key, 0) 

q := datastore.NewQuery("A").Ancestor(parentKey).KeysOnly() 
for it := q.Run(ctx);; { 
    key, err := it.Next(nil) 
    if err == datastore.Done { 
     break 
    } else if err != nil { 
     // handle error 
    } 

    if reflect.DeepEquals(key.Parent(), parentKey) { 
     directDescKeys = append(directDescKeys, key) 
    } 
} 

entities := make([]*A, len(directDescKeys)) 
if err := datastore.GetMulti(ctx, directDescKeys, entities); err != nil { 
    // handle error 
} 
संबंधित मुद्दे

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