一篇文章彻底搞懂MongoDB

一、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)一个典型的文档如下:

{
  "_id": 1,
  "name" : { "first" : "John", "last" : "Backus" },
  "contribs" : [ "Fortran", "ALGOL", "Backus-Naur Form", "FP" ],
  "awards" : [
    {
      "award" : "W.W. McDowell Award",
      "year" : 1967,
      "by" : "IEEE Computer Society"
    }, {
      "award" : "Draper Prize",
      "year" : 1993,
      "by" : "National Academy of Engineering"
    }
  ]
}

 三、索引

 使用 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 集合:

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

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

(4)删除集合

db.collection.drop()

(5)插入文档

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

db.COLLECTION_NAME.insert(document)
或
db.COLLECTION_NAME.save(document)

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

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

db.collection.insertOne(
   <document>,
   {
      writeConcern: <document>
   }
)

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

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

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

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

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

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

>db.col.find(
   {
      $or: [
         {key1: value1}, {key2:value2}
      ]
   }
).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}})

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值