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和其他的东西为好。这些可以以任何顺序呈现,并且根据需要多次显示。只要理解一个“流水线”阶段流向下一个流程即可。