数据库-MongoDB使用

简介

NoSQL(Not Only SQL)

拥护者们提倡运用非关系型的数据存储。

关系型数据库遵循ACID原则:

  1. Atomicity 原子性 事务里的操作要么全部做完,要么全不做
  2. Consistency 一致性 数据库要一直处于一直的状态,事务的运行不会改变数据库原本的一致性约束
  3. Isolation 独立性 并发的事物之间不会相互影响。如果一个事务正在访问的数据正在被另一个事务修改,只要另一个事务未提交
  4. Durability 持久性 一旦事务提交后,所做出的修改就会永久的保存在数据库中,即使出现宕机也不会丢失。

分布式系统(distributed sysytem)

由多台计算机和通信的软件组件通过计算机网络连接组成 是建立在网络上的软件系统 网络与分布式系统的区别更多的在于高层软件(特别是操作系统),而不是硬件

分布式计算的优点和缺点

CAP定理 对于一个分布式系统来说,不可能同时满足以下三点

  1. 一致性: 所有节点在同一时间有同样的数据
  2. 可用性: 保证每个请求不管成功或失败都会有响应
  3. 分隔容忍: 系统中任意信息的丢失或失败不会影响系统的继续运作

MongoDB是文档型数据库

由C++编写,基于分布式文件存储的开源数据系统。

MongoDB基本概念

数据库

一个MongoDB中可以建立多个数据库。MongoDB默认数据库为“db”,存放着在data目录中。 显示所有数据库的列表show dbs

显示当前数据库对象和集合db

连接到一个制定的数据库,若数据库不存在,则创建数据库use XXX

插入一条数据db.XXX.insert({"XXX":"YYY"})

MongoDB中默认数据库为test,需要用use进行切换 在MongoDB中集合只有在真正插入内容后才会被创建,也就是说创建集合后需要再插入一个文档。 删除数据库db.dropDatabase 注意MongoDB是区分大小写的

文档

文档是一组键值对(BSON).mongodb的文档不需要相同的字段,相同的字段不需要相同的数据类型。一个简单的文档例子如下:

{"site":"chiyuanye.com", "name":"chiyuanye"}

文档不能有重复的键。文档的键是字符串,除了少数例外情况,键可以使用任意UTF-8字符。

插入文档 db.Collection_Name.insert(document)

>db.col.insert({title: 'MongoDB 教程', 
	description: 'MongoDB 是一个 Nosql 数据库',
	by: '菜鸟教程',
	url: 'http://www.runoob.com',
	tags: ['mongodb', 'database', 'NoSQL'],
	likes: 100
	})

更新文档

先插入一条文档

>db.col.insert({
	title: 'MongoDB 教程', 
	description: 'MongoDB 是一个 Nosql 数据库',
	by: '菜鸟教程',
	url: 'http://www.runoob.com',
	tags: ['mongodb', 'database', 'NoSQL'],
	likes: 100
})

更新

>db.col.updateOne({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })   # 输出信息

> db.col.find().pretty()
{
	"_id" : ObjectId("56064f89ade2f21f36b03136"),
	"title" : "MongoDB",
	"description" : "MongoDB 是一个 Nosql 数据库",
	"by" : "菜鸟教程",
	"url" : "http://www.runoob.com",
	"tags" : [
		"mongodb",
		"database",
		"NoSQL"
	],
	"likes" : 100
}
>

如果要更新多个文档则用updateMany()

若要移除集合中的键值对,使用$unset

删除文档

db.Collection_Name.deleteMany({status:"A"})

db.Collection_name.deleteOne({status:"D"})

查询文档

db.Collection_Name.find(query, projection)query指定查询条件,projection指定返回的键值

加上.pretty()更易读

加上limit()限制读取的记录条数

加上skip()跳过指定数量的数据

加上sort({KEY:1})根据指定参数排序,1为升序,-1为降序

findOne()只返回一个文档

find()可以传入多个键,每个键用逗号隔开 >db.col.find({key1:value1, key2:value2}).pretty()

集合

集合是MongoDB文档组。类似于RDBMS(relational database management system)z中的表格。 集合没有固定的结构,可以将不同格式和类型的文档插入集合中。

capped collections 就是指定大小的collection。具有高性能和队列过期的特性。能添加新的对象,能进行更新,但是不能增加存储空间。否则更新失败。

创建集合db.createCollection(name, options)

> db.createCollection("mycol", { capped : true, autoIndexId : true, size : 
		   6142800, max : 10000 } )
{ "ok" : 1 }

删除集合db.Collection_Name.drop()

常见数据类型

  1. Objectid: 前四位表示unix时间戳,格林尼治GTC时间,接下来三位为机器识别码,紧接的两个字节为进程ID组成的PID,最后三个字节为随机数。
    > var newObject = ObjectId()
    > newObject.getTimestamp()
    ISODate("2017-11-25T07:21:10Z")
    
  2. 字符串 都是UTF-8编码

  3. 时间戳
  4. 日期

type操作符

db.col.find({likes : {$gt : 100}}) 获取 “col” 集合中 “likes” 大于 100 的数据

db.col.find({"title" : {$type : 2}})db.col.find({"title" : {$type : 'string'}}) 来获取title中为String的数据

模糊查询

查询 title 包含”教”字的文档: db.col.find({title:/教/})

查询 title 字段以”教”字开头的文档: db.col.find({title:/^教/})

查询 titl e字段以”教”字结尾的文档: db.col.find({title:/教$/})

MongoDB连接

URI标准连接语法

mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]

MongoDB索引

索引是特殊的数据结构,存储在一个易于读取和遍历的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构,通过B-Tree来实现

MongoDB使用createIndex()方法来创建索引

>db.collection.createIndex(keys, options)

用创建了索引的参数会检索会快很多

查看集合索引 db.col.getIndexes() 查看集合索引大小 db.col.totalIndexSize() 删除集合所有索引 db.col.dropIndexes() 删除集合指定索引 db.col.dropIndex("索引名称")

利用唯一索引删除重复数据

  1. 将数据导出为JSON格式存档: mongoexport.exe -d database_name -c collection_name -o filename.json
  2. 清空当前集合的数据: db.yourcollection.deleteMany({})
  3. 新建唯一索引: db.yourcollection.createIndex({public_no:1}, {unique:true})唯一主键根据自己的想筛选的重复字段进行修改
  4. zsh中导入之前存档的JSON文件数据: mongoimport -d database_name -c collection_name --upsert filename.jsonupsert会避开唯一主键相同的字段 注意要切换到合适的数据库,之前就是没有连接对应的数据库一直成功不了

MongoDB 聚合

Table of Contents