NoSQL 简介

NoSQL(NoSQL = Not Only SQL ),意即”不仅仅是SQL”。
NoSQL 是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势越发高涨。NoSQL的拥护者们提倡运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入。

关系型数据库遵循ACID规则

  1. A (Atomicity) 原子性

原子性很容易理解,也就是说事务里的所有操作要么全部做完要么都不做,事务成功的条件是事务里的所有操作都成功,只要有一个操作失败,整个事务就失败,需要回滚。

比如银行转账,从A账户转100元至B账户,分为两个步骤:1)从A账户取100元;2)存入100元至B账户。这两步要么一起完成,要么一起不完成,如果只完成第一步,第二步失败,钱会莫名其妙少了100元。

  1. C (Consistency) 一致性

一致性也比较容易理解,也就是说数据库要一直处于一致的状态,事务的运行不会改变数据库原本的一致性约束。

例如现有完整性约束a+b=10,如果一个事务改变了a,那么必须得改变b,使得事务结束后依然满足a+b=10,否则事务失败。

  1. I (Isolation) 独立性

所谓的独立性是指并发的事务之间不会互相影响,如果一个事务要访问的数据正在被另外一个事务修改,只要另外一个事务未提交,它所访问的数据就不受未提交事务的影响。

比如现在有个交易是从A账户转100元至B账户,在这个交易还未完成的情况下,如果此时B查询自己的账户,是看不到新增加的100元的。

  1. D (Durability) 持久性

持久性是指一旦事务提交后,它所做的修改将会永久的保存在数据库上,即使出现宕机也不会丢失。

MongoDB创建数据库

1
use DATABASE_NAME

如果数据库不存在,则创建数据库,否则切换到指定数据库。

MongoDB查看所有数据库

基本语法:

1
show db

运行结果:

1
2
3
admin      0.000GB
config 0.000GB
local 0.000GB

新创建的数据库并不会显示,是因为数据为空的数据库不会被展示

MongoDB删除数据库

1
2
3
4
5
-- 新建数据库test
use test
-- 插入数据
db.test.insert({"name":"test"})
show dbs
1
2
3
4
5
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
test 0.000GB

基本语法:

1
db.dropDatabase()

运行结果:

1
2
3
4
5
6
> db.dropDatabase()
{ "ok" : 1 }
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB

MongoDB创建集合(表)

显示创建

基本语法格式:

1
db.createCollection("COLLECTION_NAME")

MongoDB显示集合基本语法

1
2
3
show collections
-- 或者
show tables

MongoDB删除集合

1
db.COLLECTION_NAME.drop()

MongoDB 插入文档

基本语法:

1
db.COLLECTION_NAME.insert(document)

实例:

1
db.myCollection.insert({name:"zhangsan",age:18,likes:["game","run"]})

若插入的主键存在则抛出 org.springframework.dao.DuplicateKeyException 异常

MongoDB更新文档

基本语法:

1
2
3
4
5
6
7
8
9
db.COLLECTION_NAME.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)

参数说明:

  • query : update的查询条件,类似sql update查询内where后面的。
  • update : update的对象和一些更新的操作符(如$,$inc…)等,也可以理解为sql update查询内set后面的
  • upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
  • multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
  • writeConcern :可选,抛出异常的级别。

MongoDB删除文档

基本语法:

1
2
3
4
5
6
7
db.collection.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}
)

参数说明:

  • query :(可选)删除的文档的条件。
  • justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。
  • writeConcern :(可选)抛出异常的级别。

MongoDB 查询文档

基本语法:

1
db.COLLECTION_NAME.find(<query>, projection)

参数说明:

  • query :可选,使用查询操作符指定查询条件
  • projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。

MongoDB 条件操作符

条件操作符用于比较两个表达式并从mongoDB集合中获取数据。

在本章节中,我们将讨论如何在MongoDB中使用条件操作符。

MongoDB中条件操作符有:

  • (>) 大于 - $gt
  • (<) 小于 - $lt
  • (>=) 大于等于 - $gte
  • (<= ) 小于等于 - $lte

实例

获取年龄大于18的数据

1
db.C0LLECTION_NAME.find({age:{ $gt : 18 }})

获取年龄大于12且小于等于17的数据

1
db.COLLECTION_NAME.find({age : { $lte : 17, $gt : 12 }})

MongoDB Limit与Skip方法

MongoDB Limit() 方法

如果你需要在MongoDB中读取指定数量的数据记录,可以使用MongoDB的Limit方法,limit()方法接受一个数字参数,该参数指定从MongoDB中读取的记录条数。

基本语法:

1
db.COLLECTION_NAME.find().limit(NUMBER)

MongoDB Skip() 方法

我们除了可以使用limit()方法来读取指定数量的数据外,还可以使用skip()方法来跳过指定数量的数据,skip方法同样接受一个数字参数作为跳过的记录条数。

基本语法:

1
db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)

MongoDB 排序

基本语法:

1
db.COLLECTION_NAME.find().sort({KEY:1})

实例:

按照age升序查询

1
db.myCollection.find().sort({"age":1)