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

标签 node.js mongodb express mongoose currency

我的产品集合如下所示:

[{
  _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/

相关文章:

javascript - 使用 child_process exec 时断言在 mocha 中不起作用

node.js - 使用带有对称 key 加密的 unload 命令解密卸载的 s3 文件

子文档上的 mongoDB 文本索引

security - MongoDB 中的访问控制

node.js - 错误 : ENOENT: no such file or directory index. html Node.js

node.js - Express:如何将应用程序实例传递给来自不同文件的路由?

node.js - 无法使用 gmail SMTP

node.js - 没有使用 mongoose 6 定义的 DEFAULT 的 AuthProvider

mysql - 如何改变 Node js 中的授权(权限)级别

node.js - 将 LetsEncrypt 与 Node Express 应用程序一起使用