Mongodb Mongoose临时计算字段

Mongodb Mongoose临时计算字段,mongodb,mongoose,Mongodb,Mongoose,对于一个基本示例,我有一个模式: var testSchema = new Schema({ op1 : Number, op2 : Number }); 然后我希望有一个“total”字段,它不存储在DB中,而是在检索后自动计算出来,并且可能可以用于Mongoose的query.sort 即 然后使用myTestModel.find({}).sort(total).execFind(…) 这是可能的吗?MongoDB不允许您使用普通查询计算字段,但是,您可以使用聚合框架

对于一个基本示例,我有一个模式:

var testSchema = new Schema({
  op1    : Number,
  op2     : Number
});
然后我希望有一个“total”字段,它不存储在DB中,而是在检索后自动计算出来,并且可能可以用于Mongoose的query.sort

然后使用myTestModel.find({}).sort(total).execFind(…)


这是可能的吗?

MongoDB不允许您使用普通查询计算字段,但是,您可以使用聚合框架进行计算。你会这样做:

myTestModel.aggregate(
    { $match: {} }, // your find query
    { $project: {
        op1: 1, // original fields
        op2: 1,
        total: { $add: ['$op1', '$op2' ] } // calculated field
    } },
    { $sort: { total: 1 } },

    // And then the normal Mongoose stuff:
    function (err, res) {
    }
);

另请参见:

虚拟字段使用Mongoose很容易:但排序不是:。“你得自己做。”谢谢!这两个参考资料都很完美。@wiredpairie为什么不把它作为一个答案添加进来,这样我们就可以投票给你了?@starquake-答案已经在那里了。本应作为副本关闭。谢谢。您知道使用此函数是否比通常的.sort javascript函数有性能优势吗?不,对不起,您必须在自己的环境中对其进行基准测试。我希望它在C++中运行得更快,而不是JavaScript。
myTestModel.aggregate(
    { $match: {} }, // your find query
    { $project: {
        op1: 1, // original fields
        op2: 1,
        total: { $add: ['$op1', '$op2' ] } // calculated field
    } },
    { $sort: { total: 1 } },

    // And then the normal Mongoose stuff:
    function (err, res) {
    }
);