我正在将 MongoDB 与猫鼬一起使用。我有一个订单集合,每个订单都有货币(美元、欧元、ILS 等)和百分比。
我的节点应用程序从另一个服务读取一个值,我的 Order 集合有一个名为 price 的虚拟字段,它是根据该值和订单文档的百分比计算出来的。
import mongoose, { Schema } from 'mongoose';
import { priceValue } from '../services/price-value';
const orderSchema = new Schema({
currency: {
type: 'String',
required: true
},
percent: {
type: 'Number',
required: true
}
}, {
toObject: {
virtuals: true
},
toJSON: {
virtuals: true
}
});
orderSchema.virtual('price').get(function() {
return priceValue * this.percent;
});
export default mongoose.model('Order', orderSchema);
我需要找到每种货币的最高价格。类似于,对于每个 CURRENCY 调用:
db.orders.find({ currency: CURRENCY }).sort({percent: -1}).limit(1);
在节点应用程序中收集结果并计算虚拟价格字段。
但这感觉不正确。什么是正确的方法呢?
您可以将其委托给聚合框架,而不是使用“虚拟字段”,这比查询每个可能的“货币”值要好得多。
哪里priceValue
是一个简单的“常量”值,那么您只需将其提供给管道表达式:
db.orders.aggregate([
{ "$sort": { "currency": 1, "percent": -1 } },
{ "$group": {
"_id": "$currency",
"percent": {
"$first": {
"$multiply": [
{ "$divide": [ "$percent", 100 ] },
priceValue
]
}
}
}}
])
所以你$sort
要按照“货币”的顺序排列,并按照“货币”中的每个“百分比”递减。然后你$group
在每个不同的“货币”上,$first
从每个分组边界中获取。
然后,您需要做的就是将常量应用于$multiply
返回的值priceValue
,从$divide
by之后的“百分比”值开始100
,因为您需要实际存储的整个值的除数。
您还应该注意,从聚合管道返回的文档没有与所使用模型相同的模式附加方法。基本原因是您通常“更改返回的文档的形状”,因此“架构”不再适用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句