数据库-MongoDB使用
简介
NoSQL(Not Only SQL)
拥护者们提倡运用非关系型的数据存储。
关系型数据库遵循ACID原则:
- Atomicity 原子性 事务里的操作要么全部做完,要么全不做
- Consistency 一致性 数据库要一直处于一直的状态,事务的运行不会改变数据库原本的一致性约束
- Isolation 独立性 并发的事物之间不会相互影响。如果一个事务正在访问的数据正在被另一个事务修改,只要另一个事务未提交
- Durability 持久性 一旦事务提交后,所做出的修改就会永久的保存在数据库中,即使出现宕机也不会丢失。
分布式系统(distributed sysytem)
由多台计算机和通信的软件组件通过计算机网络连接组成 是建立在网络上的软件系统 网络与分布式系统的区别更多的在于高层软件(特别是操作系统),而不是硬件
分布式计算的优点和缺点
CAP定理 对于一个分布式系统来说,不可能同时满足以下三点
- 一致性: 所有节点在同一时间有同样的数据
- 可用性: 保证每个请求不管成功或失败都会有响应
- 分隔容忍: 系统中任意信息的丢失或失败不会影响系统的继续运作
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()
常见数据类型
- Objectid: 前四位表示unix时间戳,格林尼治GTC时间,接下来三位为机器识别码,紧接的两个字节为进程ID组成的PID,最后三个字节为随机数。
> var newObject = ObjectId() > newObject.getTimestamp() ISODate("2017-11-25T07:21:10Z")
-
字符串 都是UTF-8编码
- 时间戳
- 日期
type操作符
- (>) 大于 - $gt
- (<) 小于 - $lt
- (>=) 大于等于 - $gte
- (<= ) 小于等于 - $lte 现在已有这样一个集合
> db.col.find() { "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" : "PHP 是一种创建动态交互性站点的强有力的服务器端脚本语言。", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 } { "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高级程序设计语言。", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 } { "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }
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("索引名称")
利用唯一索引删除重复数据
- 将数据导出为JSON格式存档:
mongoexport.exe -d database_name -c collection_name -o filename.json
- 清空当前集合的数据:
db.yourcollection.deleteMany({})
- 新建唯一索引:
db.yourcollection.createIndex({public_no:1}, {unique:true})
唯一主键根据自己的想筛选的重复字段进行修改 - zsh中导入之前存档的JSON文件数据:
mongoimport -d database_name -c collection_name --upsert filename.json
upsert会避开唯一主键相同的字段 注意要切换到合适的数据库,之前就是没有连接对应的数据库一直成功不了