Mongoose临时计算字段

4

举个基本的例子,我有一个架构:

var testSchema = new Schema({
  op1    : Number,
  op2     : Number
});

我希望有一个“总计”字段,它不会被存储在数据库中,而是在检索后自动计算,并且可能可用于Mongoose的query.sort。
即:
total = op1 + op2

那么使用 myTestModel.find({}).sort(total).execFind(...);

这个可行吗?


3
使用Mongoose轻松实现虚拟字段:https://dev59.com/o2nWa4cB1Zd3GeqP4dTd#12982125 - WiredPrairie
但排序不是这样的:https://dev59.com/V2Yr5IYBdhLWcg3wuMb9#13453207。您需要自己完成。 - WiredPrairie
@WiredPrairie 谢谢!这两个参考资料非常完美。 - Manny
@WiredPrairie 为什么不把它添加为答案,这样我们就可以给你点赞了呢? - StarQuake
@starquake - 答案已经在那里了。应该被标记为重复。 - WiredPrairie
1个回答

8

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

请参见:http://mongoosejs.com/docs/api.html#model_Model.aggregate

谢谢。你知道使用这个函数是否比通常的 JavaScript 的 .sort 函数有性能优势吗? - Manny
不好意思,你需要在自己的环境中进行基准测试。我预计它会更快,因为它是在数据库中以C++运行,而不是JavaScript。 - Derick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接