2015-05-26 12 views
5

में समूह एकत्रीकरण को अनइंड करें मुझे नए सी # 2.0 मोंगोडीबी चालक और एकत्रीकरण पाइपलाइन के साथ कुछ परेशानी हो रही है।फिर मोंगोडीबी सी #

असल में, मैं ऑब्जेक्ट पर किसी सरणी फ़ील्ड के भीतर सबसे लोकप्रिय तत्वों को वापस करने का प्रयास कर रहा हूं। फ़ील्ड प्रकार है: IList<string> FavouritePlaceIds { get; set; }

db.users.aggregate([ 
    { $unwind : "$FavouritePlaceIds" }, 
    { $group: { "_id": "$FavouritePlaceIds", "count": {$sum: 1}}}, 
    { $sort : { "count": -1 }} 
]) 

हालांकि, इस मुद्दे को अब अनुवाद करने के लिए कि सी # नई MongoDB ड्राइवर 2.0 का उपयोग कर कोड में कोशिश कर रहा है:

मैं निम्नलिखित MongoDB एकत्रीकरण जो अपेक्षित ढंग से काम कर रहा है।

var pipeline = usersCollection.Aggregate() 
       .Unwind(i => i.FavouritePlaceIds) 
       .Group(i => i.FavouritePlaceIds, g => new { FavouritePlaceIds = g.Key, Count = g.Count() }) 
       .SortByDescending(i => i.Count); 

जब मैं उस कोड को संकलित करने के लिए जाना है, मैं मिलता है: http://mongodb.github.io/mongo-csharp-driver/2.0/reference/driver/crud/reading/#unwind

मैं निम्नलिखित अब तक मेरी एकत्रीकरण पाइप लाइन के लिए मिल गया है: मैं एकत्रीकरण पाइप लाइन के साथ मदद के लिए नीचे दिए गए लिंक का उपयोग कर संदेश निम्न:

'BsonDocument' does not contain a definition for 'FavouritePlaceIds' and no extension method 'FavouritePlaceIds' accepting a first argument of type 'BsonDocument' could be found...

त्रुटि विधि समूह() के पहले पैरामीटर (i => i.FavouritePlaceIds) पर उत्पन्न कर रहा है।

समूह धारा के तहत दिए गए लिंक पर नोट्स पढ़ना, यह कहा गया है कि:

Because $unwind is a type of projection, you must provide a return type.

तो, मैं यह सोचते हैं रहा है कि मैं एक सही वापसी प्रकार को निर्दिष्ट नहीं कर रहा हूँ यही कारण है कि एक उम्मीद है BsonDocument ऑब्जेक्ट, और संकलन करने में विफल।

तो, समूह विधि में उपयोग करने के लिए मैं सही रिटर्न प्रकार कैसे निर्दिष्ट कर सकता हूं?

उत्तर

4

जब आप Unwind टाइप पैरामीटर का अनुमान लगाते हैं तो यह TResult और BsonDocument के लिए संग्रह प्रकार का उपयोग TNewResult के लिए करेगा।

आप एक विशिष्ट प्रकार का उपयोग करना चाहते हैं और नहीं BsonDocument आप इन प्रकार के पैरामीटर जोड़ने के लिए की जरूरत है:

var pipeline = usersCollection.Aggregate() 
    .Unwind<OriginalType, NewResultType>(.... 

हमेशा की तरह, आप बनाने की जरूरत है सुनिश्चित करें कि आपरेशन वास्तव में कुछ है कि उस प्रकार के हो सकते हैं देता है।

+0

तो क्या मुझे कक्षा में मूल टाइप और न्यूआरसल्ट टाइप सेट करने की आवश्यकता है, फ़ील्ड क्षेत्र का सदस्य है, या फ़ील्ड का प्रकार है? – Juzzbott

+0

@Juzzbott निश्चित रूप से उस प्रकार का क्षेत्र नहीं है। 'OrignalType' संग्रह प्रकार होना चाहिए। 'न्यूआरसल्ट टाइप' 'अनविंड' में बनाए गए प्रक्षेपण का प्रकार होना चाहिए। यह शायद एक ही मूल प्रकार के साथ काम करना चाहिए। – i3arnon

+0

कक्षा 'एप्लिकेशन यूज़र' में FavouritePlaceIds फ़ील्ड है। निम्नलिखित अब संकलित हो जाएंगे, लेकिन मुझे एक अलग त्रुटि मिल रही है: 'Unwind (i => i.FavouritePlaceIds) '। त्रुटि संदेश है: BsonType 'स्ट्रिंग' से 'सूची ' सूची को deserialize नहीं कर सकता। – Juzzbott