दिलचस्प पोस्ट
आप POST क्रिया का उपयोग करके किसी पृष्ठ को कैसे पुनर्निर्देशित करते हैं? MKMapView या UIWebView ऑब्जेक्ट पर छूने वाले घटनाओं को कैसे रोकें? पर्ल प्रतिस्थापन ऑपरेटर के प्रतिस्थापन पक्ष में एक चर का उपयोग कैसे करें? एफओपी में आर और आरबी के बीच अंतर क्या है सूची में सबसे लंबी स्ट्रिंग चुनने के लिए पायथन का सबसे कारगर तरीका है? कैसे नेविगेशन मेनू के माध्यम से गतिशील एजेक्स-रीफ्रेश गतिशील सामग्री शामिल है? (जेएसएफ एसपीए) मार्ग और यूआरएल में एएसपी.नेट एमवीसी 5 संस्कृति रनटाइम में एक नौ पैच / नैनपैच ड्रायवेट बनाएँ एपेंड मोड के साथ जावा फ़्रीवेयर व्यवसाय खाता से फेसबुक ऐप बनाना और प्रबंधित करना वर्तमान C या C ++ मानक दस्तावेज़ कहां से मिलते हैं? जावास्क्रिप्ट jQuery ऑटोमैट करने के लिए एनिमेटेड उन्नत PHP डेवलपर्स के लिए एमवीसी कॉर्पोरेट फ़ायरवॉल के पीछे एक विंडोज सिस्टम चलाने के लिए डॉकर्स कैसे प्राप्त करें? VB.NET या C # में itextsharp डीएलएल के साथ पीडीएफ सामग्री पढ़ना

कैसे mongoDB में संग्रह रिकॉर्ड के अंदर सरणी को सॉर्ट करने के लिए

मोंगो डीबी नोब यहाँ …

ठीक है, मेरे पास छात्रों का संग्रह है, प्रत्येक के साथ एक रिकॉर्ड है जो निम्न के जैसा दिखाई देता है …. मैं 'प्रकार' को सॉर्ट करना चाहता हूं: 'होमवर्क' क्रम अवरोही क्रम में

मोनो खोल पर यह कैसा लग रहा है?

> db.students.find({'_id': 1}).pretty() { "_id" : 1, "name" : "Aurelia Menendez", "scores" : [ { "type" : "exam", "score" : 60.06045071030959 }, { "type" : "quiz", "score" : 52.79790691903873 }, { "type" : "homework", "score" : 71.76133439165544 }, { "type" : "homework", "score" : 34.85718117893772 } ] } 

मैं इस अभिवादन की कोशिश कर रहा हूँ ….

  doc = db.students.find() for (_id,score) in doc.scores: print _id,score 

लेकिन यह काम नहीं कर रहा है

वेब के समाधान से एकत्रित समाधान "कैसे mongoDB में संग्रह रिकॉर्ड के अंदर सरणी को सॉर्ट करने के लिए"

आपको अपने एप्लिकेशन कोड में एम्बेडेड सरणी में हेरफेर करना होगा या मोंगोडीबी 2.2 में नई एकत्रीकरण फ्रेमवर्क का उपयोग करना होगा।

mongo शेल में उदाहरण एकत्रीकरण:

 db.students.aggregate( // Initial document match (uses index, if a suitable one is available) { $match: { _id : 1 }}, // Expand the scores array into a stream of documents { $unwind: '$scores' }, // Filter to 'homework' scores { $match: { 'scores.type': 'homework' }}, // Sort in descending order { $sort: { 'scores.score': -1 }} ) 

नमूना आउटपुट:

 { "result" : [ { "_id" : 1, "name" : "Aurelia Menendez", "scores" : { "type" : "homework", "score" : 71.76133439165544 } }, { "_id" : 1, "name" : "Aurelia Menendez", "scores" : { "type" : "homework", "score" : 34.85718117893772 } } ], "ok" : 1 } 

इसी तरह हम इसे जेएस और मोंगो कंसोल के साथ हल कर सकते हैं:

 db.students.find({"scores.type": "homework"}).forEach( function(s){ var sortedScores = s.scores.sort( function(a, b){ return a.score<b.score && a.type=="homework"; } ); var lowestHomeworkScore = sortedScores[sortedScores.length-1].score; db.students.update({_id: s._id},{$pull: {scores: {score: lowestHomeworkScore}}}, {multi: true}); }) 

यहां जावा कोड है जिसका उपयोग सरणी में सबसे कम स्कोर को खोजने के लिए किया जा सकता है और इसे हटा सकते हैं।

 public class sortArrayInsideDocument{ public static void main(String[] args) throws UnknownHostException { MongoClient client = new MongoClient(); DB db = client.getDB("school"); DBCollection lines = db.getCollection("students"); DBCursor cursor = lines.find(); try { while (cursor.hasNext()) { DBObject cur = cursor.next(); BasicDBList dbObjectList = (BasicDBList) cur.get("scores"); Double lowestScore = new Double(0); BasicDBObject dbObject = null; for (Object doc : dbObjectList) { BasicDBObject basicDBObject = (BasicDBObject) doc; if (basicDBObject.get("type").equals("homework")) { Double latestScore = (Double) basicDBObject .get("score"); if (lowestScore.compareTo(Double.valueOf(0)) == 0) { lowestScore = latestScore; dbObject = basicDBObject; } else if (lowestScore.compareTo(latestScore) > 0) { lowestScore = latestScore; dbObject = basicDBObject; } } } // remove the lowest score here. System.out.println("object to be removed : " + dbObject + ":" + dbObjectList.remove(dbObject)); // update the collection lines.update(new BasicDBObject("_id", cur.get("_id")), cur, true, false); } } finally { cursor.close(); } } } 

यह अनुमान लगाने में आसान है, लेकिन वैसे भी, मोंगो विश्वविद्यालय के पाठ्यक्रमों के साथ धोखा न करें, क्योंकि आप मूल बातें नहीं समझेंगे।

 db.students.find({}).forEach(function(student){ var minHomeworkScore, scoresObjects = student.scores, homeworkArray = scoresObjects.map( function(obj){ return obj.score; } ); minHomeworkScore = Math.min.apply(Math, homeworkArray); scoresObjects.forEach(function(scoreObject){ if(scoreObject.score === minHomeworkScore){ scoresObjects.splice(scoresObjects.indexOf(minHomeworkScore), 1); } }); printjson(scoresObjects); }); 

चूंकि यह प्रश्न अलग-अलग तरीकों से प्रबंधित किया जा सकता है क्योंकि मैं कहना चाहता हूं कि दूसरा समाधान "डालें और सॉर्ट करें", इस तरह से आपको ऑर्डर किए गए सरणी मिलेगा, जब आप एक खोज करेंगे ()।

इस डेटा पर विचार करें:

 { "_id" : 5, "quizzes" : [ { "wk": 1, "score" : 10 }, { "wk": 2, "score" : 8 }, { "wk": 3, "score" : 5 }, { "wk": 4, "score" : 6 } ] } 

यहां हम दस्तावेज़ को अपडेट करेंगे, क्रमबद्ध करें

 db.students.update( { _id: 5 }, { $push: { quizzes: { $each: [ { wk: 5, score: 8 }, { wk: 6, score: 7 }, { wk: 7, score: 6 } ], $sort: { score: -1 }, $slice: 3 // keep the first 3 values } } } ) 

परिणाम है:

 { "_id" : 5, "quizzes" : [ { "wk" : 1, "score" : 10 }, { "wk" : 2, "score" : 8 }, { "wk" : 5, "score" : 8 } ] } 

प्रलेखन: https://docs.mongodb.com/manual/reference/operator/update/sort/#up._S_sort

@ साइननी का जवाब ठीक है, हो सकता है कि कई दस्तावेज (एक अंक के अनुसार) में इसे विस्फोट किए बिना मूल समूह को रखने के लिए $ समूह ऑपरेटर उपयोगी हो।

आपके आवेदन के लिए जावास्क्रिप्ट का उपयोग करते समय मैं एक और समाधान जोड़ता हूं।

अगर आप केवल एक दस्तावेज़ पूछते हैं, तो जेएस द्वारा एम्बेडेड सरणी को सॉर्ट करना कभी-कभी आसान होता है, इसके बजाय कुल मिलाकर जब आपके दस्तावेज़ में कई फ़ील्ड होते हैं, तो यह $ धक्का ऑपरेटर का उपयोग करने से बेहतर होता है, अन्यथा आप सभी क्षेत्रों को एक-एक करके, या $$ ROOT ऑपरेटर का उपयोग करना चाहते हैं (क्या मैं गलत हूँ?)

मेरा उदाहरण कोड Mongoose.js का उपयोग करता है: मान लीजिए आपने छात्र मॉडल को शुरू किया है।

 // Sorting function compare(a, b) { return a.score - b.score; } Students.findById('1', function(err, foundDocument){ foundDocument.scores = foundDocument.scores.sort(compare); // do what you want here... // foundModel keeps all its fields }); 

यह मेरे लिए यह काम है, यह थोड़ा असहज कोड है, लेकिन प्रत्येक छात्र के लिए सबसे कम कार्य के परिणाम सही हैं।

 var scores_homework = [] db.students.find({"scores.type": "homework"}).forEach( function(s){ s.scores.forEach( function(ss){ if(ss.type=="homework"){ ss.student_id = s._id scores_homework.push(ss) } } ) }) for(i = 0; i < scores_homework.length; i++) { var b = i+1; var ss1 = scores_homework[i]; var ss2 = scores_homework[b]; var lowest_score = {}; if(ss1.score > ss2.score){ lowest_score.type = ss2.type; lowest_score.score = ss2.score; db.students.update({_id: ss2.student_id},{$pull: {scores: {score: lowest_score.score}}}); }else if(ss1.score < ss2.score){ lowest_score.type = ss1.type; lowest_score.score = ss1.score; db.students.update({_id: ss1.student_id},{$pull: {scores: {score: lowest_score.score}}}); }else{ lowest_score.type = ss1.type; lowest_score.score = ss1.score; db.students.update({_id: ss1.student_id},{$pull: {scores: {score: lowest_score.score}}}); } i++ } 

मेरा मानना ​​है कि आप M101P: MongoDB for Developers जहां होमवर्क 3.1 को कम से कम दो होमवर्क स्कोर से निकाल देना है। चूंकि एग्रीग्रेशन उस बिंदु तक नहीं सिखाए गए थे, इसलिए आप ऐसा कुछ कर सकते हैं:

 import pymongo conn = pymongo.MongoClient('mongodb://localhost:27017') db = conn.school students = db.students for student_data in students.find(): smaller_homework_score_seq = None smaller_homework_score_val = None for score_seq, score_data in enumerate(student_data['scores']): if score_data['type'] == 'homework': if smaller_homework_score_seq is None or smaller_homework_score_val > score_data['score']: smaller_homework_score_seq = score_seq smaller_homework_score_val = score_data['score'] students.update({'_id': student_data['_id']}, {'$pop': {'scores': smaller_homework_score_seq}}) 

यह मेरा तरीका है पैमोबो का उपयोग कर, पायथायन ड्राइवर को मोंगोडीबी:

 import pymongo conn = pymongo.MongoClient('mongodb://localhost') def remove_lowest_hw(): db = conn.school students = db.students # first sort scores in ascending order students.update_many({}, {'$push':{'scores':{'$each':[], '$sort':{'score': 1}}}}) # then collect the lowest homework score for each student via projection cursor = students.find({}, {'scores':{'$elemMatch':{'type':'homework'}}}) # iterate over each student, trimming each of the lowest homework score for stu in cursor: students.update({'_id':stu['_id']}, {'$pull':{'scores':{'score':stu['scores'][0]['score']}}}) remove_lowest_hw() conn.close() 

इस तरह मैंने जावा में लागू किया है (इसे सरल रखा है ताकि इसे समझना आसान हो) –

दृष्टिकोण:

  1. छात्र संग्रह से स्कोर सरणी प्राप्त करें
  2. अंक स्कोर से सभी अंक प्राप्त करें जहां टाइप == होमवर्क
  3. स्कोर मानों को क्रमबद्ध करें ताकि निम्नतम तत्व 1 हो जाए [score.get (0)]
  4. फिर, मुख्य स्कोर के माध्यम से लूप और गुणों को छोड़ते हुए स्कॉरे सर की नई प्रतिलिपि बनाएँ, जहां प्रकार == होमवर्क और& स्कोर == scores.get (0)
  5. अंत में, छात्र दस्तावेजों के लिए नए स्कोर सरणी को अपडेट करें।

नीचे जावा कोड काम कर रहा है:

  public void removeLowestScore(){ //Create mongo client and database connection and get collection MongoClient client = new MongoClient("localhost"); MongoDatabase database = client.getDatabase("school"); MongoCollection<Document> collection = database.getCollection("students"); FindIterable<Document> docs = collection.find(); for (Document document : docs) { //Get scores array ArrayList<Document> scores = document.get("scores", ArrayList.class); //Create a list of scores where type = homework List<Double> homeworkScores = new ArrayList<Double>(); for (Document score : scores) { if(score.getString("type").equalsIgnoreCase("homework")){ homeworkScores.add(score.getDouble("score")); } } //sort homework scores Collections.sort(homeworkScores); //Create a new list to update into student collection List<Document> newScoresArray = new ArrayList<Document>(); Document scoreDoc = null; //Below loop populates new score array with eliminating lowest score of "type" = "homework" for (Document score : scores) { if(score.getString("type").equalsIgnoreCase("homework") && homeworkScores.get(0) == score.getDouble("score")){ continue; }else{ scoreDoc = new Document("type",score.getString("type")); scoreDoc.append("score",score.getDouble("score")); newScoresArray.add(scoreDoc); } } //Update the scores array for every student using student _id collection.updateOne(Filters.eq("_id", document.getInteger("_id")), new Document("$set",new Document("scores",newScoresArray))); } } 

निश्चित रूप से यह देर हो चुकी है, लेकिन मैं सिर्फ मोंगो शैल पर अपना खुद का समाधान देना चाहता हूं:

 var students = db.getCollection('students').find({}); for(i = 0 ; i < students.length(); i++) { var scores = students[i].scores; var tmp = []; var min = -1 ; var valueTmp = {}; for(j = 0 ; j < scores.length; j++) { if(scores[j].type != 'homework') { tmp.push(scores[j]); } else { if (min == -1) { min = scores[j].score; valueTmp = scores[j]; } else { if (min > scores[j].score) { min = scores[j].score; tmp.push(valueTmp); valueTmp = scores[j]; } else { tmp.push(scores[j]); } } } } db.students.updateOne({_id:students[i]._id}, {$set:{scores:tmp}}); } 

स्कोर द्वारा सॉर्ट करना सरल हो सकता है:

 db.students.find({_id:137}).sort({score:-1}).pretty() 

लेकिन आपको टाइप के लिए एक खोजना होगा: होमवर्क …

यह कुछ ऐसा होना चाहिए:

 db.students.find().sort(scores: ({"score":-1}));