一尘不染

猫鼬对汇总结果进行排序

node.js

我在解决此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'});

        }
    );

阅读 240

收藏
2020-07-07

共1个答案

一尘不染

从聚合管道返回的结果只是普通对象。因此,您将排序作为流水线阶段而不是作为单独的操作进行:

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

因此,也可以使用多种流水线运算符
$group


$sort


$limit

和其他东西。这些可以按任意顺序显示,并且可以根据需要多次显示。仅仅了解一个“管道”阶段的流程会导致下一步行动。

2020-07-07