Mongoose:使用自定义函数转换查询/聚合中的值



我的产品集合如下所示:

[{
_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印尼盾之间的所有产品。我的想法是获得基础货币印尼国家电力公司的当前汇率,计算每个产品货币每次迭代的边缘价格(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: {
    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(

最新更新