当前位置:   article > 正文

一篇文章彻底搞懂MongoDB_mongodb id生成规则

mongodb id生成规则

一、Mongo简介

(1)特点:

  • 面向文档存储,基于JSON/BSON 可表示灵活的数据结构
  • 动态 DDL能力,没有强Schema约束,支持快速迭代
  • 基于内存,支持快速数据查询,高性能计算
  • 基于数据分片,可以支持海量数据存储
  • 丰富的功能集,支持二级索引、强大的聚合管道功能

(2)Mongo与MySQL概念区别:

SQL概念MongoDB概念
databasedatabase
tablecollection
rowdocument
columnfield
SQL概念MongoDB概念
primary key_id
foreign keyreference
viewview
indexindex
join$lookup
transactiontrasaction
group byaggregation

挑几个介绍下:

1、_id 主键:保证文档的唯一性。
2、reference 引用:勉强可以对应于 外键(foreign key) 的概念,之所以是勉强是因为 reference 并没有实现任何外键的约束,而只是由客户端(driver)自动进行关联查询、转换的一个特殊类型

3、$lookup,这是一个聚合操作符,可以用于实现类似 SQL-join 连接的功能

4、transaction 事务,从 MongoDB 4.0 版本开始,提供了对于事务的支持

5、aggregation 聚合,MongoDB 提供了强大的聚合计算框架,group by 是其中的一类聚合操作

分布式ID生成规则:

MySQL中著名的 snowflake 算法中就同时使用了时间戳、机器号、进程号以及随机数来保证唯一性。

MongoDB 采用 ObjectId 来表示主键的类型,id 的生成规则如下:

  • 4-byte  Unix 时间戳
  • 3-byte  机器 ID
  • 2-byte  进程 ID
  • 3-byte  计数器(初始化随机)

  _id 的生成实质上是由客户端(Driver)生成的。服务端也会检测写入的文档是否包含_id 字段,如果没有就生成一个。

二、BSON 数据类型介绍

(1)简介:JSON 有自己的短板,比如无法支持像日期这样的特定数据类型,因此 MongoDB 实际上使用的是一种扩展式的JSON

(2)BSON 所支持的数据类型包括:

 (3)一个典型的文档如下:

  1. {
  2. "_id": 1,
  3. "name" : { "first" : "John", "last" : "Backus" },
  4. "contribs" : [ "Fortran", "ALGOL", "Backus-Naur Form", "FP" ],
  5. "awards" : [
  6. {
  7. "award" : "W.W. McDowell Award",
  8. "year" : 1967,
  9. "by" : "IEEE Computer Society"
  10. }, {
  11. "award" : "Draper Prize",
  12. "year" : 1993,
  13. "by" : "National Academy of Engineering"
  14. }
  15. ]
  16. }

 三、索引

 使用 wiredTiger (B+树)作为默认的引擎

 用法:

(1)ensureIndexes 为集合声明一个普通的索引(author后面的数字 1 代表升序,如果是降序则是 -1)

db.book.ensureIndex({author: 1})

 (2)复合式(compound)的索引(只有对于复合式索引时,索引键的顺序才变得有意义)

db.book.ensureIndex({type: 1, published: 1})

(3)数组(multikey)索引(索引的字段是数组类型,该索引就自动成为数组索引)

db.book.ensureIndex({tags: 1})

四、增删改查操作

MongoDB不存在SOL语句,操作它,需要使用ORM语法

(1)创建数据库

和一般的关系型数据库一样,都要建立一个自己的数据库空间

use DATABASE_NAME

如果数据库不存在,则创建数据库,否则切换到指定数据库,如果你想查看所有数据库,可以使用 show dbs

(2)删除数据库(删除当前数据库

db.dropDatabase()

(3)创建集合(建表)

db.createCollection(name, options)

参数说明:

  • name: 要创建的集合名称
  • options: 可选参数, 指定有关内存大小及索引的选项

例子:在 test 数据库中创建 runoob 集合:

  1. > use test
  2. switched to db test
  3. > db.createCollection("runoob")
  4. { "ok" : 1 }
  5. >

如果要查看已有集合,可以使用 show collections 或 show tables 命令:

(4)删除集合

db.collection.drop()

(5)插入文档

使用 insert() (不推荐)或 save() (新版已废弃)方法向集合中插入文档

  1. db.COLLECTION_NAME.insert(document)
  2. db.COLLECTION_NAME.save(document)

insert(): 若插入的数据主键已经存在,则会抛 org.springframework.dao.DuplicateKeyException 异常,提示主键重复,不保存当前数据

db.collection.insertOne():向集合插入一个新文档

  1. db.collection.insertOne(
  2. <document>,
  3. {
  4. writeConcern: <document>
  5. }
  6. )

示例:插入一条数据(官方推荐)

db.course.insertOne({"name":"linux","price":1070})

db.collection.insertMany() :用于向集合插入一个多个文档

  1. db.collection.insertMany(
  2. [ <document 1> , <document 2>, ... ],
  3. {
  4. writeConcern: <document>,
  5. ordered: <boolean>
  6. }
  7. )

示例:插入多条数据(官方推荐)

db.course.insertMany({"name":"linux","price":1070},{"name":"nodejs","price":1090})

参数说明:

  • document:要写入的文档。
  • writeConcern:写入策略,默认为 1,即要求确认写操作,0 是不要求。
  • ordered:指定是否按顺序写入,默认 true,按顺序写入

(6)查询文档

主要是(find、 findOne),这里没有findMany

示例:

ind()无条件查询:将该表(collection)中所有的数据一次性返回:

db.course.find()

条件查找:price等于1070的数据,这里会返回多条结果:

db.course.find({"price":1070})

findOne():无条件查找一条数据,默认当前collection中的第一条数据

db.course.findOne()

条件查找一条price等于1070的数据,如果有多条数据则返回更靠前的数据:

和MySQL的Where 语句比较:

操作格式范例MySQL中的类似语句
等于{<key>:<value>}db.col.find({"by":"xx"}).pretty()where by = 'xx'
小于{<key>:{$lt:<value>}}db.col.find({"likes":{$lt:50}}).pretty()where likes < 50
小于或等于{<key>:{$lte:<value>}}db.col.find({"likes":{$lte:50}}).pretty()where likes <= 50
大于{<key>:{$gt:<value>}}db.col.find({"likes":{$gt:50}}).pretty()where likes > 50
大于或等于{<key>:{$gte:<value>}}db.col.find({"likes":{$gte:50}}).pretty()where likes >= 50
不等于{<key>:{$ne:<value>}}db.col.find({"likes":{$ne:50}}).pretty()where likes != 50

 AND 条件: find() 方法可以传入多个键(key),每个键(key)以逗号隔开,即常规 SQL 的 AND 条件

>db.col.find({key1:value1, key2:value2}).pretty()

示例:通过 by 和 title 键来查询 xxx中 MongoDB 教程 的数据 

> db.col.find({"by":"xxx", "title":"MongoDB 教程"}).pretty()

OR 条件:使用了关键字 $or

  1. >db.col.find(
  2. {
  3. $or: [
  4. {key1: value1}, {key2:value2}
  5. ]
  6. }
  7. ).pretty()

示例:查询键 by 值为 xxx 或键 title 值为 MongoDB 教程 的文档

>db.col.find({$or:[{"by":"xxx"},{"title": "MongoDB 教程"}]}).pretty()

AND 和 OR 联合使用:

示例:要实现 SQL 语句为: 'where likes>50 AND (by = 'xxx' OR title = 'MongoDB 教程')'

>db.col.find({"likes": {$gt:50}, $or: [{"by": "xxx"},{"title": "MongoDB 教程"}]}).pretty()

五、查询条件

关键字说明
$or或关系
$nor或关系取反
$gt大于
$gte大于等于
$lt小于
$lte小于等于
$ne不等于
$in在多个值范围内
$nin不在多个值范围内
$all匹配数组中多个值
$regex正则,用于模糊查询
$size匹配数组大小
$maxDistance范围查询,距离(基于LBS)
$mod取模运算
$near邻域查询,查询附近的位置(基于LBS)
$exists字段是否存在
$elemMatch匹配内数组内的元素
$within范围查询(基于LBS)
$box范围查询,矩形范围
$center范围查询,圆形范围
$centerSphere范围查询,球形范围
$slice查询字段集合中的元素(比如从第几个之后,第N到第M个元素)

(1)查询某个字段不为空的数据:

db.getCollection('tableName').find({'xx':{$ne:null}})

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/648273
推荐阅读
相关标签
  

闽ICP备14008679号