【问题标题】:MongoDb multiply aggregate returns null sometimesMongoDb 乘法聚合有时返回 null
【发布时间】:2020-05-20 02:44:05
【问题描述】:

我有这个聚合:

const dpi = (imgSize.height * imgSize.width) / (printDpi * printDpi);
    let printSizes = await printSizeModel
      .aggregate([
        {
          $project: {
            id: 1,
            width: 1,
            height: 1,
            price: 1,
            shippingWidth: 1,
            shippingHeight: 1,
            shippingLength: 1,
            shippingWeight: 1,
            framePrice: 1,
            hasFrame: 1,
            total: { $multiply: ['$width', '$height'] },
          },
        },
        { $match: { total: { $lt: dpi } } },
      ])
      .exec();

width和height都是数字,DPi也是数字(DPI是float,width和height是int)

我正在使用 mongoos 和 Nodejs。此聚合有时会返回正确的结果,有时会返回 null。根据我的理解,这应该是正确的,但我可能在这里遗漏了一些东西

【问题讨论】:

  • 请提供输入(dpi)和示例文档!另外,如果它间歇性地工作,您是否要求它不工作的地方?
  • 我测试并没有返回的其中一个是:476.91609977324265
  • 不知道为什么,但你可能会遗漏一些东西,如果 total 总是一个数字,将 dpi 传递为 476.91609977324265 应该可以。
  • 总计始终是一个数字。我的一个疯狂猜测是,因为 476..... 是浮点数,它混淆了数据库并且它不返回任何东西。我将它转换为 int ,我正在观察是否可以解决问题。但是,如果您有任何其他可以帮助的建议,我将不胜感激。
  • 哦,是的,这可能是问题:-)

标签: node.js mongodb mongoose


【解决方案1】:

使用 Math.ceil 将数字转换为 Int 后,问题就消失了,所以我可以说问题是浮点数:

const dpi = Math.ceil((imgSize.height * imgSize.width) / (printDpi * printDpi));
    let printSizes = await printSizeModel
      .aggregate([
        {
          $project: {
            id: 1,
            width: 1,
            height: 1,
            price: 1,
            shippingWidth: 1,
            shippingHeight: 1,
            shippingLength: 1,
            shippingWeight: 1,
            framePrice: 1,
            hasFrame: 1,
            total: { $multiply: ['$width', '$height'] },
          },
        },
        { $match: { total: { $lt: dpi } } },
      ])
      .exec();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-18
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    • 2016-08-10
    • 1970-01-01
    • 2018-10-26
    相关资源
    最近更新 更多