NoSQL介绍
NoSQL指的是非关系型数据库,相对于传统的关系型数据库,非关系型数据库没有复杂的关系,保证数据的最终一致性而非ACID,这也使得非关系型数据库能承受较高的并发,具有高性能、高可用、高可扩展性的特点。非关系型数据库种类有很多,包括键值型、列存储、文档型、图形数据库等。常见的非关系型数据库有Redis、HBase、MongoDB等。CAP理论
CAP理论中C指的是Consistency(强一致性),A指的是Availability(可用性),P指的是Partition tolerance(分区容错性)。CAP理论强调,分布式存储系统,强一致性、可用性、分区容错性这三项最多只能保证其中的两项。对于一个分布式的系统,必须要保证分区容错性,因此,能够做出的选择只有CP或者AP,对于本文中所涉及的MongoDB数据库,它所保证的是CP。MongoDB介绍
MongoDB是为了快速开发互联网Web应用而设计的非关系型数据库系统,其设计目标是极简、灵活、作为Web应用栈的一部分。MongoDB的数据模型是面向文档的,所谓文档是一种类似于JSON的结构,简单理解MongoDB这个数据库中存的是各种各样的JSON(BSON)。{
"name": "小猿看看",
"age": 13,
"group": ["group1", "group2"]
}
MongoDB数据库中的基本概念包括数据库、集合、文档、域、索引等。
文档(document)类似于JS中的对象,在MongoDB中每一条数据都是一个文档。
集合(collection)集合就是一组文档,类似于数组,也就是集合是用来存放文档的,集合中存储的文档可以是各种各样,没有格式要求。
多个文档组成集合,多个集合组成数据库。
关系型数据库 | MongoDB |
数据库(database) | 数据库(database) |
表(table) | 集合(collection) |
数据记录行(row) | 文档(document) |
字段(column) | 域(field) |
索引(index) | 索引(index) |
表连接(table joins) | |
主键(primary key) | 主键(primary key) |
MongoDB的基本操作
数据库的启动
对于MongoDB的安装,这里就不多做介绍,具体的安装步骤网上都有详细的介绍。 MongoDB安装完成后,就需要进行启动操作,使用以下命令就可以进行启动,MongoDB启动默认占用27017端口。mongod –f /etc/mongod.conf
这里提一句,如果MongoDB出现了意外停止的情况,那么直接使用该命令进行重启是无法成功的,需要首先将 /data/mongodb/mongo.lock文件删除,才能重新启动。
数据库的基本使用
连接MongoDBmongod
显示所有数据库
show databases
show dbs
进入到指定的数据库
use 数据库名
查看所有集合
show collections
数据库查询操作
MongoDB提供了find()方法用于对文档的查询,默认查找collection下所有文档信息,find()方法可以接收一个对象作为条件参数,查询集合下的所有符合条件的文档。
db..find()
db.stus.find({"name":"小猿看看"}) #查询name为小猿看看的值
db.stus.find({"age":13}).count() #获取一共有几个文档
如果我们想要按照某种顺序对查询的结果进行排序,我们可以使用MongoDB提供的sort()方法进行排序,sort()需要接收一个对象,该对象中键为所要排序的字段,值可以传入1或者-1,分别表示按照升序排序和按照降序排序。
db.stus.find({}).sort({"name": -1})
数据库插入操作
向集合中插入文档,需要使用insert()方法。db..insert(doc)#向school数据库中的stus集合中插入一个学生对象{"name":"小猿看看","age":13,"gender":"男"}
db.stus.insert({"name":"小猿看看","age":13,"gender":"男"})
向集合中插入多个文档,不能直接将多个对象放入insert()方法,否则只会有第一个对象被插入,而应使用一个数组对象对多个对象进行封装,这样才能成功插入多个对象。
db.stus.insert([
{"name":"张三","age":13,"gender":"男"},
{"name":"李四","age":13,"gender":"男"}
])
当我们向集合插入文档时,如果没有给文档指定_id属性,则数据库会自动为文档添加_id,该属性用来作为文档的唯一标识,_id我们可以自己指定,如果我们指定了,数据库就不会添加,_id必须确保唯一。
数据库更新操作
对数据库进行更新操作需要使用到update()方法,传入查询条件和新对象,这样原对象就会被替换掉了,注意,这里是完全被替换,下面的例子,"name"等于"张三"的这条文档将完全被{"age":100}覆盖掉。db..update(查询条件,新对象)
db.stus.update({"name":"张三"},{"age":100}) #替换为新对象
如果我们只需要修改其中的某一个指定的属性,而不是替换,需要使用“修改操作符”,完成修改。
$set 可以用来修改文档中的指定属性。
db.stus.update({"name":"张三"},{$set:{"age":100}})
$unset 可以用来删除文档的指定属性。
db.stus.update({"name":"张三"},{$unset:{"age":"","gender":""}})
数据库删除操作
删除文档对象,remove()方法可以根据传递的条件删除文档, 如果 remove中传递的是空,那么就会清空文档。db..remove()
db..deleteOne()
db..deleteMany()
除了remove清空文档,也可以使用drop()直接删除集合。
db.stus.drop() #直接删除集合