Mongoose Query:比较同一文档中的两个值

时间:2014-01-22 10:18:30

标签: node.js mongodb mongoose

如何使用Mongoose查询Mongo集合,以查找在两个属性之间具有特定关系的所有文档?

例如,如何查询characters个集合,以查找currentHitPoints值小于maximumHitPoints值的所有字符?或者projects currentPledgedMoney小于pledgeGoal的所有mongoose.model('Character') .find({ player: _currentPlayer }) .where('status.currentHitpoints').lt('status.maximumHitpoints') .exec(callback)

我试过这样的事情:

lt

但我收到错误,因为Number参数必须是$.status.maximumHitpoints。如果我使用underscore(我希望Mongoose能够像进行收集操作那样解决它),情况也是如此。

这可以在查询中完成吗?我希望如此,但不知道如何。否则我可以使用find过滤整个集合,但我怀疑这会对性能产生负面影响。

PS:我也试过使用{{1}}调用的类似方法,没有骰子。

3 个答案:

答案 0 :(得分:5)

感谢Aniket在问题评论中提出的建议,我发现使用以下语法可以对Mongoose做同样的事情:

mongoose.model('Character')
    .find({
        player: _currentPlayer
    })
    .$where('this.status.currentHitpoints < this.status.maximumHitpoints')
    .exec(callback)

请注意,使用的是$where方法,而不是where方法。

编辑:要扩展下面的Derick's评论,一个性能更敏感的解决方案是在Mongoose模式中包含一个包含比较结果的布尔属性,并在每次保存文档时更新它。这可以通过使用Mongoose Schema插件轻松实现,所以你会有类似的东西:

var CharacterSchema = new mongoose.Schema({
    // ...
    status: {
        hitpoints: Number,
        maxHitpoints: Number,
        isInFullHealth: {type: Boolean, default: false}
    }
})
.plugin(function(schema, options) {
     schema.pre('save', function(next) {
         this.status.isInFullHealth = (this.status.hitPoints >= this.status.maxHitpoints);

         next();
     })
 })

答案 1 :(得分:1)

MongoDB 3.6及更高版本支持查询语言内的聚合表达式:

db.monthlyBudget.find( { $expr: { $gt: [ "$spent" , "$budget" ] } } )

https://docs.mongodb.com/manual/reference/operator/query/expr/

答案 2 :(得分:0)

mongoose.model('Character')
    .find({
        player: _currentPlayer, $expr: { $lt: ['$currentHitpoints', '$maximumHitpoints'] }
    })

上面的查询意味着找到currentHitpoints小于maximumHitpoints的记录