MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Как да сортирам колекция въз основа на стойности в масив

Както може би вече сте опитали, не можете да посочите конкретен елемент в масив като "ключ" за "сортиране" с просто намиране. За това ще ви е необходим обобщеният метод, за да получите ключовете, по които искате да сортирате.

db.exam.aggregate([

     # Unwind to de-normalize
     { "$unwind": "$result" },

     # Group back to the document and extract each score
     { "$group": {
         "_id": "$_id",
         "result": { "$push": "$result" },
         "useruid": { "$first": "$useruid" },
         "exam_code": { "$first": "$exam_code" },
         "ess_time": { "$first": "$ess_time" },
         "Total": { 
             "$max": {
                 "$cond": [
                     { "$eq": [ "$result.subject", "Total" ] },
                     "$result.score",
                     0
                 ]
             }
         },
         "Physics": { 
             "$max": {
                 "$cond": [
                     { "$eq": [ "$result.subject", "Physics" ] },
                     "$result.score",
                     0
                 ]
             }
         },
         "Mathematics": { 
             "$max": {
                 "$cond": [
                     { "$eq": [ "$result.subject", "Mathematics" ] },
                     "$result.score",
                     0
                 ]
             }
         },
         "Chemistry": { 
             "$max": {
                 "$cond": [
                     { "$eq": [ "$result.subject", "Chemistry" ] },
                     "$result.score",
                     0
                 ]
             }
         },
         "Biology": { 
             "$max": {
                 "$cond": [
                     { "$eq": [ "$result.subject", "Biology" ] },
                     "$result.score",
                     0
                 ]
             }
         }
     }},

     # Sort on those scores
     { "$sort": {
         "Total": -1,
         "Physics": -1,
         "Mathematics": -1,
         "Chemistry": -1,
         "Biology": -1
     }},

     # Project final wanted fields
     { "$project": {
         "result": 1,
         "useruid": 1,
         "exam_code": 1,
         "ess_time": 1
     }}
])

Така че тук „извличате“ съответстващите стойности с помощта на $cond оператор в рамките на $max оператор след размотаване на масива. Денормализираните документи не всички имат едни и същи стойности, тъй като те сега представляват елементите в масива, така че ги тествате.

С тези извлечени ключове можете да сортирате отново целите си документи и след това накрая да изхвърлите тези полета, тъй като вече не ви трябват.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB $exp

  2. java.lang.IllegalArgumentException:Очаква се уникален резултат или нула, но има повече от един! - Spring Data Mongo

  3. MongoDb Select Query Проблем с регулярен израз (започва с малко и завършва с малко)

  4. Показване на данните върху уеб страница, извлечена от mongodb с помощта на node.js

  5. Услугата MongoDB няма да стартира след първоначалната настройка