MongoDB

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//缓存--->文件--->关系型数据库
//1.数据保存到内存:
优点:
1)读写非常快
缺点:
1)程序关闭导致数据丢失

//2.数据保存到文件:
优点:
1)数据可以永久保存
缺点:
1)频繁地IO操作,效率不高!
2)数据管理不方便。例如查询某个数据需要全部读取出来,再匹配。

//3.数据保存到数据库软件:
优点:
1)数据永久保存下来
2)数据管理非常方便。(例如查询非常快速和方便)

关系型数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
关系型数据库(Mysql和Oracle) : 表和表、表和字段、数据和数据存在着关系

优点:
1.数据之间有关系,进行数据的增删改查的时候是非常方便的
2.关系型数据库是有事务操作的,保证数据的完整性和一致性。

缺点:
1.因为数据和数据是有关系的,底层是运行了大量的算法。大量算法会降低系统的效率,会降低性能
2.数据存在硬盘中,面对海量数据的增删改查的时候会显的无能为力,面对海量数据对数据进行维护变得非常的无力
3.限制字段:比如现在数据库中已经有10万条数据了(在今天10万条都不算大数据),如果想从下一条数据开始增加一些字段,此时之前的10万条数据都需要一同被更改。SQL中,表的字段是不能自由更改的,不能某一个条目有一些字段,另外的条目的没有。

适合处理一般量级的数据(银行转账和钱)


Oracle,甲骨文公司的产品。 当前最流行应用最广泛的数据库软件。适合中大型,中大应用。
SQL Server: 是微软公司的产品。window平台应用非常广泛。和c#,net平台兼容非常好。
DB2: IBM公司的产品。
MySQL: 开源组织的产品。甲骨文公司的产品。免费

非关系型数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
非关系数据库的(redis和MangDB)。
为了处理海量数据,非关系数据库设计之初就是为了替代关系型数据库的

优点:
1.数据维护在缓存中,海量数据的增删改查和维护和处理非常轻松
2.非关系型数据库简单易部署,基本都是开源软件
3.非关系型数据库存储格式是key,value形式、文档形式、图片形式等等,所以可以存储基础类型以及对象或者是集合等各种格式,非常灵活

缺点:
1.数据和数据没有关系,他们之间就是单独存在的
2.数据维护在内存中,当有海量数据的时候会非常占内存,而内存的价格会比较高

适合处理海量数据,保证效率,不一定安全(统计数据,例如微博数据)


MongoDB
Redis

非关系型数据库的分类

1
2
3
4
5
6
7
键值类数据库 : Redis

列存储数据库 : HBase

文档类数据库 : MongoDB

图形数据库 : Graph

mongoDB的介绍

1
2
3
MongoDB是一个高性能、开源、无模式的文档型数据库,设计用于提供高性能、水平可扩性、高可用性和高级可查询性,为Web应用提供可扩展的高性能数据存储解决方案。

MongoDB的名称取自单词”humogous”中间的几个字符,是很大、巨大的意思。该数据库由10gen公司开发并提供技术支持,它属于NoSQL数据库家族中的一员,在许多场景下可以用来替代传统关系型数据库或key/value存储方式。
1
2
3
4
5
6
7
8
9
10
11
12
13
MongoDB的设计目标是高性能、可扩展、易部署、易使用,存储数据非常方便。其主要功能特性如下: 
(1) 面向集合存储,容易存储对象类型的数据。在MongoDB中数据被分组存储在集合中,集合类似RDBMS中的表,一个集合可以存储无限多的文档。
(2) 模式自由,采用无模式结构存储。在MongoDB里的集合中,存储的是无模式的文档,采用无模式存储数据是集合(Collection)区别于RDBMS中的表(Table)的一个重要特征。
(3) 支持完全索引,可以在任意属性上建立索引,包含内部对象。MongoDB的索引和RDBMS的索引基本一样,可以在指定属性、内部对象上创建索引以提高查询的速度。除此之外,MongoDB还可以提供创建基于地理空间的索引的能力。
(4) 支持查询。MongoDB支持丰富的查询操作,MongoDB几乎支持SQL中的大部分查询。
(5) 强大的聚合工具。MongoDB除了提供丰富的查询功能外,还提供强大的聚合工具,如count、group等,支持使用MapReduce完成复杂的聚合任务。
(6) 支持复制和数据恢复。MongoDB支持主从复制机制,可以实现数据备份、故障恢复、读扩展等功能。而基于副本集的复制机制提供了自动故障恢复的功能,确保了集群数据不会丢失。
(7) 使用高效的二进制数据存储,包括大型对象(如视频)。使用二进制格式存储,可以保存任何类型的数据对象。
(8) 自动处理分片,以支持云计算层次的扩展。MongoDB支持集群自动切分数据,对数据进行分片可以使集群存储更多的数据,实现更大的负载,也能保证存储的负载均衡。
https://cloud.tencent.com/developer/article/1138683
(9) 支持Perl、PHP、Java、C# 、JavaScript、Ruby、C和C++语言的驱动程序,Mon提供了当前所有主流开发语言的数据库驱动包,开发人员使用任何一种主流开发语言都可以轻松编程,实现访问MongoDB数据库。
(10) 文件存储格式为BSON(JSON的一种拓展)。BSON是二进制格式JSON的简称,BSON支持文档和数组的嵌套。
(11) 可以通过网络远程访问MongoDB数据库。

安装

1、安装mongodb数据库 下载链接

​ 注意 安装时不要勾选安装图形化界面。

2、安装NoSQLBooster for MongoDB

配置

1、将mongodb安装目录下的bin路径,添加至系统环境变量path中

2、在c盘根目录下新建data文件夹,在data文件夹中新建db文件夹

检测

在cmd下键入

1
mongod --version

若正确显示版本号,则安装配置成功

启动

1.启动MongoDB数据库 会默认使用C:/data/db作为数据存储目录,所以在使用mongod命令之前需要先在c盘中新建一个data目录,在data目录下新建db目录,才能启动成功

在cmd下键入

1
mongod //启动数据库

在cmd下键入

1
2
mongod --datapath=数据存储目录    //修改mongoDB默认数据存储目录
mongod –dbpath 数据存储目录 //启动

链接

在cmd下键入

1
2
mongo   //链接数据库
exit //断开链接

关闭

在cmd下按下

1
ctrl + c

mongo数据库操作

NoSQLBooster中mongode使用

才使用mongo之前先给出常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
show dbs        //显示所有的数据库
use library //使用某个数据库
db //显示当前使用的数据库
//向library中的books集合中插入一条数据 (虽然一开始没有library仓库和books集合,但是不妨碍我们使用)
db.books.insertOne({"name":"tom"})
show collections //显示当前library仓库下的所有集合
db.books.find() //显示igeek仓库下的books集合中的所有数据

//再插入一条数据
db.books.insertOne({"name":"kitty","age":18})
db.books.find()

//删除数据库
db.dropDatabase()

//在当前数据库下创建集合
db.createCollection("igeek")

//删除当前仓库下的igeek集合
db.igeek.drop()

//插入文档
db.igeek.insert({name:"hello"})

//删除指定的文档数据
db.igeek.remove({'name':'hello'})

//更新文档数据
db.igeek.update(
{name:"hello"},
{$set:{name:"xxx"}},
{
//upsert:true 如果要更新的文档不存在会插入一条新的记录
upsert:true,
multi:true
}
)

//根据id更新数据
//save方法有更新和插入两种功能,到底是插入还是更新文档取决于save的参数。
db.igeek.save({
"_id" : ObjectId("5c09f5deaf853bfb8a003425"),
"name" : "kkk",
"tags" : [
"mongodb",
"NoSQL"
],
"likes" : 110
})

新建链接

1
打开NoSQLBooster for MongoDB --> connect --> create --> save & connect

建立链接

创建一个数据库并写入一条文件

1
2
use library  //指定使用library数据库  此时db关键字就代表library了
db.books.insertOne({"name":"红楼梦"}) //向library数据库中的books集合新增一条数据

通过NoSQLBooster for MongoDB将文件内容写入数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//1.在桌面创建这个文件,JSON和JSON之间没有逗号:
{"uname":"李灵黛","age":12,"sex":"男","provice":"上海"}
{"uname":"柳辰飞","age":13,"sex":"女","provice":"北京"}
{"uname":"江城子","age":17,"sex":"男","provice":"广东"}
{"uname":"萧合凰","age":37,"sex":"女","provice":"河北"}
{"uname":"西粼宿","age":16,"sex":"男","provice":"广东"}
{"uname":"千湄","age":13,"sex":"女","provice":"广东"}
{"uname":"林墨瞳","age":13,"sex":"女","provice":"吉林"}
{"uname":"柳婵诗","age":14,"sex":"女","provice":"河北"}
{"uname":"李念儿","age":19,"sex":"女","provice":"广东"}


//2.运行命令导入数据
$ mongoimport -d 仓库名 -c 集合名 C:\Users\Danny\Desktop\1.txt

-d参数表示需要往哪个数据库中导入数据
-c 参数表示需要往哪个集合(表)中导入数据

在NoSQLBooster for MongoDB中输入命令可以对数据库进行操作,此处不加赘述,仅介绍通过node如何对数据库进行增删改查操作

node中mongo的使用

​ node中对mongo数据库的操作需要用到 mongoose包

​ mongoose关于Model给出的关于操作数据的常用API

首先要创建Model对象,如obb,具体创建过程,下文有述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
///////////////////////////////
//增 将obb数据对象添加到集合中
obb.save().then(function(data){
//回调刚刚保存的数据对象
})

//当一个页面发出post保存表单数据到数据库中时的操作
router.post('/add',(req,res)=>{
//添加id
req.body._id = mongoose.Types.ObjectId();
//声明一个Student Model
let stu = new Student();
//将表单数据浅拷贝到stu Model对象中
Object.assign(stu,req.body);
//保存
stu.save().then(function(){
res.redirect('/student/studentList');
},function(err){
res.render('studentAdd.html',{err_msg:err.message})
});
});

///////////////////////////////
//删
Book.remove({name:"红楼梦"}).then(function(msg){
//回调刚刚删除的数据对象
})

///////////////////////////////
//改
//new 默认为false 返回修改之前的数据 true返回修改之后的数据
Book.findByIdAndUpdata(_id,{要加入数据库的对象},{new:true}).then(function(data){});

///////////////////////////////
//查
Book.find();//查询所有数据
//Book.find().then(function(data){});//中返回的data是封装过的对象,我们要的数据其实是data._doc
Book.find({ name: '红楼梦', price: { $gte: 20 }}); //加入查询条件 与
Book.find({$or:[{name:'三国演义'},{price:{$gte:20}}]); //加入查询条件 或
Book.findOne(条件);
Book.findById();

1、新建node项目(文件夹)

2、在项目中安装第三方包 mongoose

1
2
npm init -y
npm install mongoose

3.新建js文件(如server.js)

1)引入mongoose
1
const mongoose = require('mongoose');
2)建立连接
1
2
//mongoose.connect('mongodb://域名/数据库名', {useNewUrlParser: true});
mongoose.connect('mongodb://localhost:27017/library', {useNewUrlParser: true});
3)连接对象的回调
1
2
3
4
5
var db = mongoose.connection;//拿到链接对象
db.on('error', console.error.bind(console, 'connection error:'));//
db.once('open', function() {
// we're connected!
});
4)创建一个schema

这个schema是与数据库中表的schema是一一对应的

这种机制是ORM object relational model 对象关系映射模型

1
2
3
4
5
var bookSchema = new mongoose.Schema({
name: String
//是否全部借出
isLendAll: Boolean
});

schema数据类型除了String类型 还有以下几种

1
2
3
4
5
6
7
8
• String
• Number
• Date
• Boolean
• Buffer //流,音频 视频等文件可以由此保存
• ObjectId // 使用 mongoose.Schema.Types.ObjectId
• Mixed //混合数据格式 使用 mongoose.Schema.Types.Mixed
• Array

schema数据字段中还可以更细化的限制其取值,例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var bookSchema = new mongoose.Schema({
name: {
type: String,
minlength: 1,//规定字符串最小长度
maxlenght:10 //规定字符串最大长度
match: //限定字符串格式,正则表达式
}String
price: {
type: Number,
min: 0, //限定最小值
max: 100 //限定最大值
}
//是否全部借出
isLendAll:{
type: Boolean,
enum: [0,1], //枚举 用数据限定isLendAll可以取到的值
default: 0 //默认值
}
});
5)新建一个model对象

此时 Book对象 与 数据库中books集合形成一一对应关系,对Book的操作,便是对集合books的操作,接下来的操作都是建立在此基础上的。

1
var Book = mongoose.model('book', bookSchema); //注意此处创建对象时,model中入参 'book' 时,那么数据库中对应的集合应该以 books 命名,不然无法对响应表进行操作
查询一条数据
1
2
3
4
5
6
7
8
9
Book.find({name: '红楼梦'},function(err,arr){  
if(err){
return;
}else{
console.log(arr);
}
});
//打印结果 [ { _id: 5cf3c3f19cad171ee8e202ca, name: '红楼梦' } ]
//是一个数组 就算只有一条数据 最后得到的数据也是数组
新增数据
1
2


最后更新: 2019年09月02日 11:07

原始链接: https://HowlCN.github.io/2019/03/16/MongoDB/

× 请我吃糖~
打赏二维码