检查 bson 字段的“类型”以确定它是否为 $numberDecimal (mongo/node)

Check `type` of bson field to determine if it's a $numberDecimal (mongo/node)

我正在处理 mongo 聚合管道结果。我需要将 Decimal128 值转换为数字。例如

amount: { $numberDecimal: '200' } <-- dont want
amount: 200 // <-- desired format

棘手的部分是我想递归检查每个 属性 并且仅当它是小数时,然后将其更改为数字。所以我的问题是,确定 bson 对象是否为 NumberDecimal 的最佳方法是什么?我能够通过首先调用

来实现这一点
JSON.parse(JSON.stringify(object))  

// Before parsing:
// Decimal128 {_bsontype: 'Decimal128', bytes: <Buffer 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3c 30> }
// After parsing:
// amount: { $numberDecimal: '200' }

然后检查每个对象是否有 $numberDecimal 属性,如果有则调用 Number() 值。总的来说,这似乎是实现这一目标的一种循环方式。

有没有更好的方法不涉及解析对象和查找 $numberDecimal 键;我希望我能够做一些事情,比如检查 bson 对象的 typeof 或 instanceof,但它只是 object:(

这是我的函数(有效),但我觉得肯定有比检查 $numberDecimal 键更好的方法。

  const recursivelyMutateNumDec = (object) => {
    const jsonObj = JSON.parse(JSON.stringify(object));
    for (const k in (jsonObj)) {
      if (typeof jsonObj[k] === 'object' && jsonObj[k] !== null) {
        if (jsonObj[k]?.$numberDecimal) {
          // eslint-disable-next-line no-param-reassign
          jsonObj[k] = Number(object[k]);
        } else recursivelyMutateNumDec(jsonObj[k]);
      }
    }
    return jsonObj;
  };

感谢任何 insight/suggestions!

Decimal128 是 BSON 类型。如果导入它:

const { Decimal128 }  = require('bson');

您可以检查代码中的类型,如下所示:

if (object[k] instanceof Decimal128) {