如何使用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}}调用的类似方法,没有骰子。
答案 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
的记录