默认情况下,MongoDB shell将所有数字解释为浮点数;尝试将现有JSON格式的数据(在Mongo中存储为字符串)转换为实际的Mongo BSON对象时,这是一个问题。使用NumberInt(...)
/ NumberLong(...)
显式和手动包装数据中的任何整数值也是单调乏味的,因为整数可以出现在数据中的任何位置。
有没有办法将一个MongoDB shell会话配置为默认使用NumberInt
或NumberLong
?
另外:有没有办法将一串JSON解析成MongoDB shell中的一个对象,这样所有没有小数点的数字都已用NumberInt
/ {{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" ] }