MONGODB mongodb 一般人不知道的数据类型与使用

4bd7a27ab203794ff1b32c0591b314ef.png

开头还是介绍一下群,如果感兴趣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 类型,一部分是其他的类型,我们怎么来区别。实际上我们遇到了这样的问题。

fa4fe558acc81f439bbd68f4a05df647.png


db.test.find({"name":{$type:"string"}})

178a927ba626a66abf58bd3022babf87.png


这样我们就可以查出,当前test collection中的所有name 是string类型的documents. 比如我们查询 string 里面的null

242d917cc740889da5d1b4d5c1601d35.png

那么除了这些以外,还有开发经常忽略的一些数值类型,如 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 等

6586f7adb58a7bc8d93e5b966f5f7179.png

写到这里问题就来了,我想使用INT 类型在MONGODB 中表达数据,怎么办,因为我们在怎么使用这个部分,结果都是DOUBLE

这就要求我们在写入数据的情况下,指定你的数据类型,如INT

eaa1fedf9a62ad3899e6f810d1df2928.png

> 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 }

如果你固定了使用的具体的数据类型,你输入的数据与类型不匹配,将被修改为你设定的类型。但是如果你超过你指定的数据类型的范围,那么输入的数据将变得是错误的数据,这点需要使用者注意。

236ba91061317104d2e696d4e27f64e4.png

> 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") }

3e68aa6fda3e4f13da600deab4c03a41.png

所以官方文档说明的数据部分,可能你在理解上如果出现问题,会导致你的输入的数据的类型和你希望的类型是不一致,甚至你认为数据库可以进行维度的转换也是错误的。

这里就会出现一个核心的问题,你发现的mongodb 的collection 几经了不同的开发人员,一部分数据是 STRING 一部分是INT ,那么你该怎么办。

>  db.test.update({}, [ {$set:{ "age" : {$toDouble: "$age"}}} ], {multi:true})

WriteResult({ "nMatched" : 17, "nUpserted" : 0, "nModified" : 9 })

def3b5f67380f562e9e1b1428f2e63d6.png

1e2d9d8febbd29b3354c139baf8ea6a4.png

但是如果是想转换成INT 则会报错,原因还是转换的值超过了INT的范围16436c54dd69219e71facbe8de9a0b6d.png

这里有一个问题,关于MONGODB ,到底MOGNODB 是都使用STRING 类型好,还是应该使用MONGODB 自有的数据类型。可以去下面的连接来看看一些回答。

而MONGODB 的数据类型应该怎么用,这仅仅是一个开端,更深入的数据类型的研究还应该继续。

01eac15aa680cd71301750fd0902671b.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值