3

默认情况下,MongoDB shell 将所有数字解释为浮点数;当试图将现有的 JSON 格式数据(在 Mongo 中存储为字符串)转换为实际的 Mongo BSON 对象时,这是一个问题。NumberInt(...)用/显式地手动包装数据中的任何整数值也很乏味,NumberLong(...)因为整数可以出现在数据中的任何位置。

有没有办法配置一个 MongoDB shell 会话以使用NumberIntNumberLong默认使用?

或者:有没有办法将 JSON 字符串解析为 MongoDB shell 中的对象,以便所有不带小数点的数字都已经用NumberInt/包裹NumberLong

4

1 回答 1

2

我现在最终使用的解决方案是markIntegers对从返回的数据调用一个函数JSON.parse;它似乎工作正常。为了完整起见,我将其发布在这里;非常欢迎更好的解决方案和更正!

function markIntegers(obj) {
    if (obj instanceof Array) {
        return obj.map(function(x) { return markIntegers(x); });
    // make sure it's a plain object and not Date or BinData etc
    } if (obj !== null && typeof obj === "object" && obj.constructor === Object) {
        var ret = {}
        for (var key in obj)
            ret[key] = markIntegers(obj[key]);
        return ret;
    } else if (typeof obj === "number") {
        return obj === Math.floor(obj) ? NumberLong(obj) : obj;
    } else {
        return obj;
    }
}

像这样工作:

> markIntegers({a: {b: 3}, c: 4.4, e: ["hello"]})
{ "a" : { "b" : NumberLong(3) }, "c" : 4.4, "e" : [ "hello" ] }
于 2014-06-04T14:29:33.350 回答