2014-10-29 153 views
23

我在解決這個mongodb(貓鼬)問題有很多困難。貓鼬排序彙總的結果

有這個架構'推薦'(用戶名,roomId,ll和日期),其集合包含用戶的建議。

我需要獲得最推薦的房間列表(按roomId)。下面是模式和我嘗試過的貓鼬查詢解決方案。

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'}); 

     } 
    ); 

回答

47

從聚合管道返回的結果只是普通的對象。所以,你做的排序爲管道階段,而不是作爲一個單獨的操作:

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 
    } 
); 

所以有各種pipeline operators可以用來$group$sort$limit和其他的東西爲好。這些可以以任何順序呈現,並且根據需要多次顯示。只要理解一個「流水線」階段流向下一個流程即可。