配置Mongo shell默认将所有数字存储为整数

时间:2014-06-04 13:46:57

标签: mongodb mongodb-shell

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

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

另外:有没有办法将一串JSON解析成MongoDB shell中的一个对象,这样所有没有小数点的数字都已用NumberInt / {{1}包裹}?

1 个答案:

答案 0 :(得分: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" ] }