对mongodb中的字段数组进行排序

时间:2016-08-07 08:00:50

标签: node.js mongodb express mongoose aggregation-framework

我有一个场景,我有一个名为ratings的数组中的等级和轮次 我需要根据轮次(1,2,3,4)按降序对评级进行排序。 我正在使用快速js和mongoose驱动程序进行查询

查询:

   **//Get top ratings based on round
exports.topRating = function(req, res) {
    console.log(req.query);
    Profiles.aggregate([{
            $match: {
                "hiringManager": req.query.hiringManager,
                "ratings.round":parseInt(req.query.round)
            }
        },{ $sort : { "ratings.rating" : -1 } }],
        function(err, profiles) {
            if (err) {
                return handleError(res, err);
            }
            console.log(profiles);
            return res.status(200).json(fnStruncturedData(profiles));

        });
};

架构:

    var mongoose = require('mongoose'),

        Schema = mongoose.Schema;

    var ProfilesSchema = new Schema({
    name:String,
    ratings: [{
            round: Number,
            rating: Number,
            feedback: String,
            interviewer: String,
            roundStatus: String
        }]
    })

假设我的数据存储在db中,如下所示

[{
name:"a",
ratings:[{
                round: 1,
                rating: 3,
                feedback: "something",
                interviewer: "abc",
                roundStatus: "selected"
            },

{
                round: 2,
                rating: 5,
                feedback: "something",
                interviewer: "abc",
                roundStatus: "selected"
            },
{
                round: 3,
                rating: 4,
                feedback: "something",
                interviewer: "abc",
                roundStatus: "selected"
            },{
                round: 4,
                rating: 1,
                feedback: "something",
                interviewer: "abc",
                roundStatus: "selected"
            }]
},
{
name:"b",
ratings:[{
                round: 1,
                rating: 5,
                feedback: "something",
                interviewer: "abc",
                roundStatus: "selected"
            },

{
                round: 2,
                rating: 4,
                feedback: "something",
                interviewer: "abc",
                roundStatus: "selected"
            },
{
                round: 3,
                rating: 3,
                feedback: "something",
                interviewer: "abc",
                roundStatus: "selected"
            },{
                round: 4,
                rating: 2,
                feedback: "something",
                interviewer: "abc",
                roundStatus: "selected"
            }]
}]

我在客户端放下adrop,用户选择轮次,因此会出现最高评级。 比如圆一: 对数据进行排序,根据查询,我首先在数组中获取name:b数据 第二轮: 我应该先在数组中获得name:a,但它会再次显示name:b个数据 在这里,我可以完美地排列1个等级,而圆形(2,3,4)显示没有变化 我不明白查询中有什么不对 请帮忙

1 个答案:

答案 0 :(得分:0)

问题在于,您不感兴趣的回合中的数据仍然包含在内,并且正在影响您的排序阶段。

如果不需要返回来自其他轮次的数据,一个简单的解决方案是首先展开评级,然后排除$ match阶段中所有不匹配的轮次。

例如,这应该有效:

[
{
    $unwind: "$ratings"
},
{
    $match: {
        "hiringManager": req.query.hiringManager,
        "ratings.round":parseInt(req.query.round)
    }
},
{
    $sort: { 
        "ratings.rating" : -1 
    } 
}
]