开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(共600人左右 1 + 2)。
MONGODB 在使用中,出现的问题比较少,不少开发者本身并不注意,大多数对于MONGODB 的数据类型的认知并不多,而我们在mongodb的运营中发现开发基本上就是在使用string 类型的方式。
String 类型
这是开发大多数最常用的格式,与JAVA 里面的数据类型一样,STRING 类型。这里MONGODB 的数据存储中使用BSON 通过UTF-8 来进行存储。
在这里有一些在MONGODB中的设计者,认为既然MOGNODB可以在键值方面每个document 的key value 都是自由的,那么如果我一个collection中的一部分是 string 类型,一部分是其他的类型,我们怎么来区别。实际上我们遇到了这样的问题。
db.test.find({"name":{$type:"string"}})
这样我们就可以查出,当前test collection中的所有name 是string类型的documents. 比如我们查询 string 里面的null
那么除了这些以外,还有开发经常忽略的一些数值类型,如 int , long 两种类型,而这两种的类型是有范围的,这里两种的类型会进行自动的切换,如果你的值超过int 会进入到 long 的类型中进行存储。
int| -2,147,483,648 to 2,147,483,647| 0 to 4,294,967,295 |
long| -9,223,372,036,854,775,808 to | 0 to 18,446,744,073,709,551,615
9,223,372,036,854,775,807
插入相关的数据
db.test.insertOne({age: -2147483648})
db.test.insertOne({age: -9223372036854775808})
db.test.insertOne({age: 4294967295 })
db.test.insertOne({age: 18446744073709551615})
db.test.insertOne({age: 28446744073709551615})
实际上我按照上面的范围进行插入数据,则这些数据的类型是double 而不是我们范围中的 INT LONG 等
写到这里问题就来了,我想使用INT 类型在MONGODB 中表达数据,怎么办,因为我们在怎么使用这个部分,结果都是DOUBLE
这就要求我们在写入数据的情况下,指定你的数据类型,如INT
> db.test.find({"age": {$type: "int"}})
{ "_id" : ObjectId("63c674c2d0c9b3cc56fc047b"), "age" : 18 }
>
> db.test.insertOne({age: NumberInt("19.03")})
{
"acknowledged" : true,
"insertedId" : ObjectId("63c67638d0c9b3cc56fc047c")
}
> db.test.find({"age": {$type: "int"}})
{ "_id" : ObjectId("63c674c2d0c9b3cc56fc047b"), "age" : 18 }
{ "_id" : ObjectId("63c67638d0c9b3cc56fc047c"), "age" : 19 }
如果你固定了使用的具体的数据类型,你输入的数据与类型不匹配,将被修改为你设定的类型。但是如果你超过你指定的数据类型的范围,那么输入的数据将变得是错误的数据,这点需要使用者注意。
> db.test.insertOne({age: NumberLong("10294967295")})
{
"acknowledged" : true,
"insertedId" : ObjectId("63c67775d0c9b3cc56fc0480")
}
> db.test.find({"age": {$type: "long"}})
{"_id":ObjectId("63c67766d0c9b3cc56fc047f"),"age":NumberLong("6294967295") }
{"_id":ObjectId("63c67775d0c9b3cc56fc0480"),"age":NumberLong("10294967295") }
所以官方文档说明的数据部分,可能你在理解上如果出现问题,会导致你的输入的数据的类型和你希望的类型是不一致,甚至你认为数据库可以进行维度的转换也是错误的。
这里就会出现一个核心的问题,你发现的mongodb 的collection 几经了不同的开发人员,一部分数据是 STRING 一部分是INT ,那么你该怎么办。
> db.test.update({}, [ {$set:{ "age" : {$toDouble: "$age"}}} ], {multi:true})
WriteResult({ "nMatched" : 17, "nUpserted" : 0, "nModified" : 9 })
但是如果是想转换成INT 则会报错,原因还是转换的值超过了INT的范围
这里有一个问题,关于MONGODB ,到底MOGNODB 是都使用STRING 类型好,还是应该使用MONGODB 自有的数据类型。可以去下面的连接来看看一些回答。
而MONGODB 的数据类型应该怎么用,这仅仅是一个开端,更深入的数据类型的研究还应该继续。