MongoDB中的数值类型分为四种,分别是double、int、long、decimal类型,每种类型对应的数值长度不一。
而MongoDB中所有类型的有效值如下所示:
MongoDB中有效的数据类型
向数据库中插入一个collection(表)测试
> db.taxes.insertMany(... [... {"_id": 1, "tax": 9999999, "desc": "不手动指定数值类型,默认的数值类型为double类型"},... {"_id": 2, "tax": NumberInt(9999999), "desc": "手动指定长度为32位符号整数型"},... {"_id": 3, "tax": NumberLong(9999999), "desc": "手动指定长度为64位符号整数型"},... {"_id": 4, "tax": NumberDecimal(9999999), "desc": "手动指定长度为16位符号浮点型"}... ]... ){ "acknowledged" : true, "insertedIds" : [ 1, 2, 3, 4 ] }> > db.taxes.find(){ "_id" : 1, "tax" : 9999999, "desc" : "不手动指定数值类型,默认的数值类型为double类型" }{ "_id" : 2, "tax" : 9999999, "desc" : "手动指定长度为32位符号整数型" }{ "_id" : 3, "tax" : NumberLong(9999999), "desc" : "手动指定长度为64位符号整数型" }{ "_id" : 4, "tax" : NumberDecimal("9999999.00000000"), "desc" : "手动指定长度为16位符号浮点型" }
其中id为1的文档在插入tax字段时没有指定数值类型,该字段的类型通过如下方式确认,说明插入数值没有明确指定数据类型时,默认为"double"类型。
> db.taxes.find({"tax": {$type: "double"}}){ "_id" : 1, "tax" : 9999999, "desc" : "不手动指定数值类型,默认的数值类型为double类型" }> db.taxes.find({"tax": {$type: 1}}){ "_id" : 1, "tax" : 9999999, "desc" : "不手动指定数值类型,默认的数值类型为double类型" }
注意:$type作用,查询一个文档某个字段的值是否属于MongoDB指定的数据类型之一,$type对应的value可以为上述表中的alias字段或者number字段,比如我们查询文档中tax字段的类型是否是Double类型(即双精度类型),可以指定$type的value为1或者"double",如果匹配,就会列对应的文档数据。
分别查询int、long、decimal类型的文档数据
> db.taxes.find({"tax": {$type: "int"}}){ "_id" : 2, "tax" : 9999999, "desc" : "手动指定长度为32位符号整数型" }> db.taxes.find({"tax": {$type: 16}}){ "_id" : 2, "tax" : 9999999, "desc" : "手动指定长度为32位符号整数型" }> > db.taxes.find({"tax": {$type: "long"}}){ "_id" : 3, "tax" : NumberLong(9999999), "desc" : "手动指定长度为64位符号整数型" }> db.taxes.find({"tax": {$type: 18}}){ "_id" : 3, "tax" : NumberLong(9999999), "desc" : "手动指定长度为64位符号整数型" }> > db.taxes.find({"tax": {$type: "decimal"}}){ "_id" : 4, "tax" : NumberDecimal("9999999.00000000"), "desc" : "手动指定长度为16位符号浮点型" }> db.taxes.find({"tax": {$type: 19}}){ "_id" : 4, "tax" : NumberDecimal("9999999.00000000"), "desc" : "手动指定长度为16位符号浮点型" }
这里需要注意的是decimal数值类型,当插入的浮点数据大于16位(小数点也算一位),会存在丢失数据精度的风险,例如插入17位的数据。
> var num = NumberDecimal(9999999.4999999999)> numNumberDecimal("9999999.50000000")
可以看到插入的数值被四舍五入了变成了16位(小数点占了一位),在将其他数据库的数据迁移到MongoDB时需要特别留意数值类型的转换。