如何在mongoDB中对集合记录中的数组进行排序

如何在mongoDB中对集合记录中的数组进行排序

MongoDB noob在这里......

好的,我有一个学生集合,每个都有一个如下所示的记录....我想按照降序排序'类型':'家庭作业'分数。

那个咒语在mongo shell上是什么样的?

> 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

但它不起作用。


郎朗坤
浏览 2760回答 3
3回答

温温酱

您需要在应用程序代码中操作嵌入式数组,或在MongoDB 2.2中使用新的聚合框架。mongoshell中的示例聚合: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}

长风秋雁

这就是我们用JS和mongo控制台解决这个问题的方法:db.students.find({"scores.type":&nbsp;"homework"}).forEach( &nbsp;&nbsp;function(s){ &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;sortedScores&nbsp;=&nbsp;s.scores.sort( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function(a,&nbsp;b){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;a.score<b.score&nbsp;&&&nbsp;a.type=="homework"; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;); &nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;lowestHomeworkScore&nbsp;=&nbsp;sortedScores[sortedScores.length-1].score; &nbsp;&nbsp;&nbsp;&nbsp;db.students.update({_id:&nbsp;s._id},{$pull:&nbsp;{scores:&nbsp;{score:&nbsp;lowestHomeworkScore}}},&nbsp;{multi:&nbsp;true}); &nbsp;&nbsp;})

噜噜哒

这是java代码,可用于找出数组中的最低分数并将其删除。public&nbsp;class&nbsp;sortArrayInsideDocument{public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;throws&nbsp;UnknownHostException&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;MongoClient&nbsp;client&nbsp;=&nbsp;new&nbsp;MongoClient(); &nbsp;&nbsp;&nbsp;&nbsp;DB&nbsp;db&nbsp;=&nbsp;client.getDB("school"); &nbsp;&nbsp;&nbsp;&nbsp;DBCollection&nbsp;lines&nbsp;=&nbsp;db.getCollection("students"); &nbsp;&nbsp;&nbsp;&nbsp;DBCursor&nbsp;cursor&nbsp;=&nbsp;lines.find(); &nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(cursor.hasNext())&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DBObject&nbsp;cur&nbsp;=&nbsp;cursor.next(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BasicDBList&nbsp;dbObjectList&nbsp;=&nbsp;(BasicDBList)&nbsp;cur.get("scores"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Double&nbsp;lowestScore&nbsp;=&nbsp;new&nbsp;Double(0); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BasicDBObject&nbsp;dbObject&nbsp;=&nbsp;null; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(Object&nbsp;doc&nbsp;:&nbsp;dbObjectList)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BasicDBObject&nbsp;basicDBObject&nbsp;=&nbsp;(BasicDBObject)&nbsp;doc; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(basicDBObject.get("type").equals("homework"))&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Double&nbsp;latestScore&nbsp;=&nbsp;(Double)&nbsp;basicDBObject&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.get("score"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(lowestScore.compareTo(Double.valueOf(0))&nbsp;==&nbsp;0)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lowestScore&nbsp;=&nbsp;latestScore; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbObject&nbsp;=&nbsp;basicDBObject; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;(lowestScore.compareTo(latestScore)&nbsp;>&nbsp;0)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lowestScore&nbsp;=&nbsp;latestScore; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dbObject&nbsp;=&nbsp;basicDBObject; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;remove&nbsp;the&nbsp;lowest&nbsp;score&nbsp;here. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("object&nbsp;to&nbsp;be&nbsp;removed&nbsp;:&nbsp;"&nbsp;+&nbsp;dbObject&nbsp;+&nbsp;":" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;dbObjectList.remove(dbObject)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;update&nbsp;the&nbsp;collection &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lines.update(new&nbsp;BasicDBObject("_id",&nbsp;cur.get("_id")),&nbsp;cur, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;true,&nbsp;false); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;finally&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cursor.close(); &nbsp;&nbsp;&nbsp;&nbsp;}}}
打开App,查看更多内容
随时随地看视频慕课网APP