23

Mam dużo trudności w rozwiązaniu tego problemu z mongodą (mangusta).Mongoose sortuj zagregowany wynik

Istnieje schemat "Polecenie" (nazwa użytkownika, pokój room, data i data), a jego kolekcja zawiera zalecenia użytkownika.

Potrzebuję uzyskać listę najbardziej polecanych pokoi (według roomId). Poniżej znajduje się schemat i moje wypróbowane rozwiązanie z zapytaniem mangusty.

var recommendSchema = mongoose.Schema({ 
    username: String, 
    roomId: String, 
    ll: { type: { type: String }, coordinates: [ ] }, 
    date: Date 
}) 
recommendSchema.index({ ll: '2dsphere' }); 

var Recommend = mongoose.model('Recommend', recommendSchema); 
Recommend.aggregate(
     { 
      $group: 
      { 
       _id: '$roomId', 
       recommendCount: { $sum: 1 } 
      } 
     }, 
     function (err, res) { 
      if (err) return handleError(err); 
      var resultSet = res.sort({'recommendCount': 'desc'}); 

     } 
    ); 

Odpowiedz

47

Wyniki otrzymane z potoku agregacji są po prostu obiektami. Więc robisz sortowania jako etap rurociągu, a nie jako oddzielnej operacji:

Recommend.aggregate(
    [ 
     // Grouping pipeline 
     { "$group": { 
      "_id": '$roomId', 
      "recommendCount": { "$sum": 1 } 
     }}, 
     // Sorting pipeline 
     { "$sort": { "recommendCount": -1 } }, 
     // Optionally limit results 
     { "$limit": 5 } 
    ], 
    function(err,result) { 

     // Result is an array of documents 
    } 
); 

więc istnieją różne pipeline operators, które mogą być wykorzystane do $group lub $sort lub $limit i inne rzeczy, jak również. Mogą one być prezentowane w dowolnej kolejności i tyle razy, ile potrzeba. Tylko zrozumienie, że jeden etap "potoku" wpływa na następne działania.