检查 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) {
我正在处理 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) {