我的产品集合如下所示:
[{
_id: '1',
name: 'Car'
price: {
currency: 'EUR',
value: 1200
}
}, {
_id: '2',
name: 'TV'
price: {
currency: 'GBP',
value: 150
}
}, {
_id: '3',
name: 'Phone'
price: {
currency: 'USD',
value: 240
}
}]
现在,有人向我的后端发送请求,要求显示价格在 10 到 500 PLN 之间的所有产品。我的想法是获取基础货币 PLN 的当前汇率,计算每种产品货币每次迭代的边缘价格(10 和 500),并查看价格是否在计算范围内。问题是我无法构建正确的查询。我尝试过这样的:
const query = [
...(req.query.priceFrom ? [{ "price.value": { "$gte": getCalculatedRange(req.query.priceFrom, '$price.currency') }}] : []),
...(req.query.priceTo ? [{ "price.value": {"$lte": getCalculatedRange(req.query.priceTo, '$price.currency') }}] : [])
];
const products = await Product.find({ $and: query });
正如您所看到的,我希望获得当前迭代产品价格的正确范围,但问题是不可能(或者可能?)将当前迭代中的值(在我的例子中:货币)传递给函数以获得转换后的值。文本“$price.currency”被传递给函数,而不是对象的实际值(我知道这在我看来是显而易见且愚蠢的,但我想彻底说明它并清楚我所遇到的困难)。
有办法让它发挥作用吗?
最佳答案
通过聚合和组合运算符解决了这个问题,例如:
- $addFields - 用于创建临时字段以保留转换后的价格
针对多种货币情况的嵌套 $switch:
$switch: { branches: [ { case: { $eq: ['eur', '$price.currency'] }, then: { $multiply: ['$price.value', getRate(req.query.priceUnit.toLowerCase(), 'eur')] }, }, { case: /* next case */ } ], default: '$price.value' }
$redact + $cond + $gte/$lte 检查转换后的价格是否在特定范围内(如果是:$$KEEP,否则:$$PRUNE)
关于node.js - Mongoose:使用自定义函数转换查询/聚合中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58845503/