MongoDB的数据类型

BSON

JSON作为一种轻量级的数据交换格式,JSON的可读性非常好,而且非常便于系统生成和解析,这些优势也让它逐渐取代了XML标准在Web领域的地位,当今许多流行的Web应用开发框架,如SpringBoot都选择了JSON作为默认的数据编/解码格式。
BSON由10gen团队设计并开源,目前主要用于MongoDB数据库。BSON(Binary JSON)是二
进制版本的JSON,其在性能方面有更优的表现。BSON在许多方面和JSON保持一致,其同样也支持
内嵌的文档对象和数组结构。二者最大的区别在于JSON是基于文本的,而BSON则是二进制(字节
流)编/解码的形式。在空间的使用上,BSON相比JSON并没有明显的优势。

类型

TypeNumberAliasNotes
Double1“double”
String2“string”
Object3“object”
Array4“array”
Binarydata5“binData”
Undefined6“undefined”Deprecated.
ObjectId7“objectId”对象ID,用于创建文档ID(一般是客户端生成的)
Boolean8“bool”
Date9“date”
Null10“null”
Regular Expression11“regex”正则表达式
DBPointer12“dbPointer”Deprecated.
JavaScript13“javascript”
Symbol14“symbol”Deprecated.
JavaScript code with scope15“javascriptWithScope”Deprecated in MongoDB
32-bitinteger16“int”
Timestamp17“timestamp”
64-bit integer18“long”
Decimal12819“decimal”New
Min key-1“minKey”表示一个最小值
Max key127“maxKey”表示一个最大值
db.books.find({"title" : {$type : 2}})
#或者
db.books.find({"title" : {$type : "string"}})

日期

MongoDB的日期类型使用UTC(Coordinated Universal Time)进行存储,也就是+0时区的时间。

test> db.dates.insertMany([{data1:Date()},{data2:new Date()},{data3:ISODate()}])
{
  acknowledged: true,
  insertedIds: {
    '0': ObjectId("649bfdcb74d3e265a2c7b095"),
    '1': ObjectId("649bfdcb74d3e265a2c7b096"),
    '2': ObjectId("649bfdcb74d3e265a2c7b097")
  }
}
test> db.dates.find().pretty()
[
  {
    _id: ObjectId("649bfdcb74d3e265a2c7b095"),
    data1: 'Wed Jun 28 2023 17:30:51 GMT+0800 (中国标准时间)'
  },
  {
    _id: ObjectId("649bfdcb74d3e265a2c7b096"),
    data2: ISODate("2023-06-28T09:30:51.940Z")
  },
  {
    _id: ObjectId("649bfdcb74d3e265a2c7b097"),
    data3: ISODate("2023-06-28T09:30:51.940Z")
  }
]

ObjectId生成器

MongoDB集合中所有的文档都有一个唯一的_id字段,作为集合的主键。在默认情况下,_id字段
使用ObjectId类型,采用16进制编码形式,共12个字节。
大多数客户端驱动都会自行生成这个字段,比如MongoDB Java Driver会根据插入的文档是否包
含_id字段来自动补充ObjectId对象。这样做不但提高了离散性,还可以降低MongoDB服务器端的计
算压力。在ObjectId的组成中,5字节的随机数并没有明确定义,客户端可以采用机器号、进程号来实
现:
ObjectId

属性/方法描述
str返回对象的十六进制字符串表示。
ObjectId.getTimestamp()将对象的时间戳部分作为日期返回。
ObjectId.toString()以字符串文字“”的形式返回 JavaScript 表示ObjectId(…)。
ObjectId.valueOf()将对象的表示形式返回为十六进制字符串。返回的字符串是str属性

内嵌文档

复合对象类型

db.books.insert({
	title: "撒哈拉的故事",
	author: {
		name:"三毛",
		gender:"女",
		hometown:"重庆"
	}
})

查找

db.books.find({"author.name":"三毛"})

避免全部字段很大的情况,只返回指定的字段(图引):

db.books.find({"author.name":"三毛"},{title:1,tags:1})
# 只保留最后一个 tags
db.books.find({"author.name":"三毛"},{title:1,tags:{$slice:-1}})
# 包含多个元素的
db.books.find({tags:{$all:["伤感","想象力"]}})
## 查询子属性的
db.goods.find({tags:{$elemMatch:{tagKey:"color",tagValue:"黑色"}}})

修改

db.books.updateOne({"author.name":"三毛"},{$set:{"author.hometown":"重庆/台湾"}})
# 给数组添加元素
db.books.updateOne({"author.name":"三毛"},{$push:{tags:"猎奇"}})

固定大小的集合

test> db.createCollection("logs",{capped:true,size:4096,max:10})
{ ok: 1 }
test> for(var i=0;i<15;i++){
... db.logs.insert({t:"row-"+i})
... }
DeprecationWarning: Collection.insert() is deprecated. Use insertOne, insertMany, or bulkWrite.
{
  acknowledged: true,
  insertedIds: { '0': ObjectId("649c14eed4dd77c08d104166") }
}
test> db.logs.find()
[
  { _id: ObjectId("649c14eed4dd77c08d10415d"), t: 'row-5' },
  { _id: ObjectId("649c14eed4dd77c08d10415e"), t: 'row-6' },
  { _id: ObjectId("649c14eed4dd77c08d10415f"), t: 'row-7' },
  { _id: ObjectId("649c14eed4dd77c08d104160"), t: 'row-8' },
  { _id: ObjectId("649c14eed4dd77c08d104161"), t: 'row-9' },
  { _id: ObjectId("649c14eed4dd77c08d104162"), t: 'row-10' },
  { _id: ObjectId("649c14eed4dd77c08d104163"), t: 'row-11' },
  { _id: ObjectId("649c14eed4dd77c08d104164"), t: 'row-12' },
  { _id: ObjectId("649c14eed4dd77c08d104165"), t: 'row-13' },
  { _id: ObjectId("649c14eed4dd77c08d104166"), t: 'row-14' }
]

capped表示固定大小的集合
size表示集合的大小kb
最大的大小为10个

使用场景

固定集合很适合用来存储一些“临时态”的数据。“临时态”意味着数据在一定程度上可以被丢弃。同时,用户还应该更关注最新的数据,随着时间的推移,数据的重要性逐渐降低,直至被淘汰处
理。
一些适用的场景如下:系统日志,这非常符合固定集合的特征,而日志系统通常也只需要一个固定的空间来存放日志。在MongoDB内部,副本集的同步日志(oplog)就使用了固定集合。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值