2017-11-09 14 views
7

से सूची AggregationOperations प्राप्त करने के लिए मैं एक समारोह है कि एक परम के रूप में एक Aggregation aggregation प्राप्त की है।स्प्रिंग मोंगो> कैसे एकत्रीकरण

मैं aggregation से सभी AggregationOperation प्राप्त करना चाहते हैं। इसे करने का कोई तरीका है?

public Aggregation newCustomAggregation(Aggregation aggregation, Criteria c) { 
    // How to get list operation aggregation there? 
    listOperation.push(Aggregation.match(c)); 
    return Aggregation 
      .newAggregation(listOperations); 
} 

मेरे उद्देश्य अपने कस्टम MatchAggregation के साथ एक और Aggregation नया है।

+0

कैसे आप इस 'newCustomAggregation' समारोह के प्रयोग पर योजना की तरह कुछ? – chridam

+0

हैलो चिराडम, मैं इसका उपयोग पैरामीटर के रूप में प्राप्त करते समय परिणाम को फ़िल्टर करने के लिए गतिशील मानदंड जोड़ने के लिए करना चाहता हूं (वैसे ही query.addCriteria (... myCriteria)) –

उत्तर

4

आप सुरक्षित संचालन क्षेत्र तक पहुंचने के लिए एकत्रीकरण को उप-वर्गीकरण करके अपना स्वयं का कस्टम एकत्रीकरण कार्यान्वयन बना सकते हैं।

public class CustomAggregation extends Aggregation { 
     List<AggregationOperation> getAggregationOperations() { 
     return operations; 
    } 
} 

public Aggregation newCustomAggregation(Aggregation aggregation, Criteria c) { 
    CustomAggregation customAggregation = (CustomAggregation) aggregation; 
    List<AggregationOperation> listOperations = customAggregation.getAggregationOperations(); 
    listOperations.add(Aggregation.match(c)); 
    return Aggregation .newAggregation(listOperations); 
} 
+0

यह सवाल का जवाब नहीं देता है। प्रश्न 'एकत्रीकरण' उदाहरण से 'एकत्रीकरण ऑपरेशन' की सूची प्राप्त करने के बारे में है। इस समाधान को केवल 'कस्टमएग्रेगेशन' उदाहरण से 'एकत्रीकरण ऑपरेशन' की एक सूची मिलती है। किसी भी अन्य 'एग्रीगेशन' के लिए यह सिर्फ 'क्लासकास्ट अपवाद' फेंकता है। मुझे उसमें ज्यादा समझ नहीं आती है। – jannis

+0

@jannis जैसा कि आपने पहले ही नोट किया है कि 'एग्रीगेशन' वर्ग से 'ऑपरेशंस' फ़ील्ड प्राप्त करने का कोई तरीका नहीं है। मैंने उत्तर प्रदान किया है जहां सेशन 'संरक्षित' वर्ग को 'संरक्षित' ऑपरेशंस फ़ील्ड तक पहुंचने के लिए उपक्रमित कर सकता है और गेटटर के माध्यम से क्षेत्र का खुलासा कर सकता है। मुझे बताएं कि कौन सा हिस्सा अभी भी स्पष्ट नहीं है। – Veeram

+0

मैं यह नहीं कह रहा कि यह स्पष्ट नहीं है। मैं कह रहा हूं कि यह सवाल का जवाब नहीं देता है। – jannis

2

Aggregation में एक संपत्ति operations है जो आपको Aggregation में सभी लागू ऑपरेशन प्रदान करेगी।

protected List<AggregationOperation> allOperations = aggregation.operations ; 

आपको सभी लागू संचालन देगा।

+2

ए) यह स्थिर नहीं है। बी) यह संरक्षित है। – jannis

+0

ध्यान देने के लिए धन्यवाद। मेरा उत्तर अपडेट किया गया –

+0

मैंने देखा लेकिन इस संपत्ति को पाने का कोई तरीका नहीं है .. क्या कोई रास्ता है? –

4

लघु जवाब: नहीं, वहाँ यह करने के लिए कोई अच्छा तरीका है। operationsAggregation वर्ग के एक संरक्षित संपत्ति है -

नहीं 'आसान' एक Aggregation उदाहरण बाहर से AggregationOperation सूची प्राप्त करने के तरीका नहीं है।

आप इसे आसानी से प्रतिबिंब के साथ प्राप्त कर सकते हैं लेकिन ऐसा कोड नाजुक और बनाए रखने के लिए महंगा होगा। शायद इस संपत्ति के संरक्षित रहने के लिए एक अच्छा कारण है। आप इसके बारे में Spring-MongoDB's JIRA में पूछ सकते हैं। मुझे लगता है कि इसके लिए एक वैकल्पिक दृष्टिकोण है।

आप पैरामीटर के रूप में AggregationOperation का संग्रह लेने के लिए अपनी विधि बदल सकते हैं लेकिन आपकी पोस्ट में यह समाधान संभव है कि यह समाधान आपके मामले में व्यवहार्य है या नहीं।

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