2014-04-08 8 views
36

साथ छँटाई मैं mongodb.I से नामों की एक क्रमबद्ध रूप प्राप्त करना चाहते हैं पाया कि इस प्रश्न के निष्पादन मैं करने में सक्षम था के साथ निम्नमोंगो डीबी केस संवेदी

query.sort().on("name", Order.ASCENDING) 

के माध्यम से किया था मामले से क्रमबद्ध परिणाम संवेदनशील। लेकिन मैं सिर्फ अनदेखा फॉर्म के मामले में परिणाम प्राप्त करना चाहता हूं। यह कैसे करना है? कृपया मुझे इसके माध्यम से मार्गदर्शन करें।

मैं जावा कोड पर काम कर रहा हूं। तो कृपया मुझे उपयुक्त तरीकों के साथ सुझाव दें।

+0

है कृपया, विस्तृत थोड़ा और अपने प्रश्न – rpax

उत्तर

33

अद्यतन: यह उत्तर पुराना है, 3.4 में केस असंवेदनशील अनुक्रमणिका होगी। अधिक जानकारी https://jira.mongodb.org/browse/SERVER-90


दुर्भाग्य MongoDB अभी तक केस संवेदी अनुक्रमित नहीं है के लिए JIRA के लिए देखो: https://jira.mongodb.org/browse/SERVER-90 और कार्य को पीछे धकेल दिया गया है।

इसका मतलब है कि वर्तमान में केस असंवेदनशील सॉर्ट करने का एकमात्र तरीका वास्तव में एक विशिष्ट "निचला चरण" फ़ील्ड बनाना है, जो कि क्रमशः सॉर्ट फ़ील्ड के मूल्य (पाठ्यक्रम के निचले चरणबद्ध) की प्रतिलिपि बनाना और उस पर सॉर्ट करना है।

+0

तो वहाँ के लिए कोई विकल्प नहीं है परिणाम को असंवेदनशील के साथ सॉर्ट करना जब तक कि केवल कम या ऊपरी चरण वाले मानों वाले नए फ़ील्ड को न बनाएं। ryt ?? –

+1

@ वरुण कुमार योंग यह मोंगोडीबी के बुरे बिंदुओं में से एक है, मैं व्यक्तिगत रूप से नीचे दिए गए उत्तर का उपयोग नहीं करता, मोंगोडीबी इंडेक्स के बिना 32 मेगाहर्ट्ज तक सीमित होगा जिसके परिणामस्वरूप बहुत कम परिणाम सेट की अनुमति दी जा रही है। – Sammaye

+1

@ वरुणकुमार अधिक सटीक होने के लिए आप दस्तावेज़ों के आकार के आधार पर 2 से 32,000 रिकॉर्ड सॉर्ट करने के बीच ही सीमित रहेंगे, न कि केवल यह कि स्मृति पूरी तरह से स्मृति में होगा, जो एक हत्यारा – Sammaye

36

छंटाई MongoDB में इस तरह काम करता है, लेकिन आप कुल फिरते ऐसा कर सकते हैं:

{ "field" : "BBB" } 
{ "field" : "aaa" } 
{ "field" : "AAA" } 
निम्न कथन से

तो:

db.collection.aggregate([ 
    { "$project": { 
     "field": 1, 
     "insensitive": { "$toLower": "$field" } 
    }}, 
    { "$sort": { "insensitive": 1 } } 
]) 

निम्न डेटा ले लो

परिणाम देगा जैसे:

{ 
    "field" : "aaa", 
    "insensitive" : "aaa" 
}, 
{ 
    "field" : "AAA", 
    "insensitive" : "aaa" 
}, 
{ 
    "field" : "BBB", 
    "insensitive" : "bbb" 
} 

सम्मिलन का वास्तविक क्रम किसी भी मूल्य के लिए बनाए रखा जाएगा जिसके परिणामस्वरूप कनवर्ट किया जाएगा।

+0

यूप कहूंगा .. यह गड़बड़ दिखता है .. लेकिन मैं इसे जावा कोड से कार्यान्वित करना चाहता हूं .. तो अगर आप मुझे साझा करते हैं तो यह अधिक उपयोगी होगा कि यह कैसे प्राप्त किया जा सकता है मैगोडब और क्वेरी ऑब्जेक्ट को संभालने के साथ जावा क्लास। –

+0

@ वरुणकुमार आपको मूल रूप से डीबीओब्जेक्ट प्रविष्टियों का निर्माण करने की आवश्यकता है जिसे आप कुल विधि में पास करते हैं। प्रलेखन संसाधनों में [यह उदाहरण] (http://docs.mongodb.org/ecosystem/tutorial/use-aggregation-framework-with-java-driver/) है। तो अनुवाद करना मुश्किल नहीं होना चाहिए। और यह मानते हुए कि यह दिखाने का वास्तविक जवाब है कि यह कैसे किया जा सकता है जो बहुत कठिन नहीं होना चाहिए। –

+0

क्या यह धीमा होगा (यानी कुल मिलाकर मूल्यांकन किया जाता है?) –

2

यहां यह जावा में है। मैं सिर्फ किस्म

 DBCollection coll = db.getCollection("foo"); 

     List<DBObject> pipe = new ArrayList<DBObject>(); 

     DBObject prjflds = new BasicDBObject(); 
     prjflds.put("field", 1); 
     prjflds.put("insensitive", new BasicDBObject("$toLower", "$field")); 

     DBObject project = new BasicDBObject(); 
     project.put("$project", prjflds); 
     pipe.add(project); 

     DBObject sort = new BasicDBObject(); 
     sort.put("$sort", new BasicDBObject("insensitive", 1)); 
     pipe.add(sort); 

     AggregationOutput agg = coll.aggregate(pipe); 

     for (DBObject result : agg.results()) { 
      System.out.println(result); 
     } 
9

के लिए कोई आर्ग और BasicDBObject की पहली कुंजी-वैल वेरिएंट मिलाया यह MongoDB JIRA पर काफी लंबे समय के लिए एक issue कर दिया गया है, लेकिन अब यह समाधान हो जाता है। this release notes for detailed documentation पर एक नज़र डालें। आपको collation का उपयोग करना चाहिए।

User.find() 
    .collation({locale: "en" }) //or whatever collation you want 
    .sort({name:'asc'}) 
    .exec(function(err, users) { 
     // use your case insensitive sorted results 
    }); 
+0

यह मेरे लिए काम नहीं किया – CodeHacker

0

हम JavaScript श्रृंखला

यहाँ में .sort समारोह की मदद से इस समस्या का समाधान कोड

 

    function foo() { 
     let results = collections.find({ 
     _id: _id 
     }, { 
     fields: { 
      'username': 1, 
     } 
     }).fetch(); 

     results.sort((a, b)=>{ 
     var nameA = a.username.toUpperCase(); 
     var nameB = b.username.toUpperCase(); 

     if (nameA nameB) { 
      return 1; 
     } 
     return 0; 
     }); 

     return results; 
    } 

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