MongoDB教程

概述

结构型数据库

传统的数据库MySQL、SQL Server、Oracle、Access都是SQL结构型数据库。

优点:查找快、有主键的概念、从键、主从查找、映射等等的高级数据库的概念。

缺点:如果今后需要增加字段,之前的所有的条目,也要一起增加。特别耗费时间,也就是说灵活性不够。

非关系型数据库

MongoDB(文档型数据库)、Redis(K-V对型数据库),他们都是NoSQL。

非关系型数据库现在已经广泛的应用于:社交平台、APP通信记录、银行流水、电信通话详单等等。任何只需要保存,但是不需要精确查找的使用场景,都可以用非关系型数据库。

MongoDB 安装

下载地址:https://www.mongodb.com/download-center#community

下载完成会安装一个bin文件夹,bin文件夹中提供的 exe文件,不要双击运行,而是应该在 cmd中运行,他们是 CLI 程序。此时如果用cd命令切换进来,不方便,所以我们要把这个bin文件夹设置为环境变量,此时就能够在系统的任何一个位置,使用MongoDB的CLI命令。

总结:数据库根本不需要安装,我们仅仅下载了一个rar文件,解压缩之后,把bin路径设置为环境变量,数据库就配置好了。

数据库的开机

在C盘根目录创建一个 MongoDBdata文件夹。

开启数据库:

1
mongod --dbpath C:\MongoDBdata

使用mongod这个CLI来进行开机,需要配置一个参数--dbpath,表示数据库存在哪里。

使用数据库的时候,不能关闭这个CMD窗口,关闭了,数据库也关闭了。

数据库的使用

  • 新建一个CMD窗口,用mongo命令管理数据库。
1
mongo

执行上述命令会进入 mongo 内部光标。

  • 创建一个数据库:
1
use student

use表示使用一个数据库,如果数据库不存在,就自动创建一个。

  • 创建一个集合,并且插入数据
1
db.banji.insert({"name":"小明","age":12,"sex":"男"});

当你使用use之后,永远用db来表示当前数据库。

db打点表示集合,现在创建了一个集合叫做banji。使用insert来插入文档,文档就是JSON。

  • 查找全部数据
1
db.banji.find({})

查询所有男生:

1
db.banji.find({"sex":"男"})
  • 查看当前数据库(就是你use的那个数据库)中有多少个集合:
1
show collections
  • 查看一共有多少数据库:
1
show dbs

可视化管理工具

CMD太难用了,但是以后你部署到Linux中,常用的还是CLI管理数据库。

MongoDB的可视化管理工具,最好用的就是MongoBooster,自己安装即可。

image

  • 导入和导出数据
1
mongoimport --db student --collection banji0910 --drop --file C:\Users\Danny\Desktop\1.json

mongoimport命令负责导入数据,--db表示选择数据库,--collection表示选择集合,--drop表示删除之前的数据
--file表示文件地址,注意路径可以相对,可以绝对。

当然,最简单的还是直接从可视化工具中的import按钮直接导入。

MongoDB 的 CRUD 操作

CRUD就是增删改查的意思。我们先学习在shell中的操作,然后用nodejs操作Mongo。

MongoDB可以被PHP、Java、.net链接,也能被node链接,所以有很多版本。我们现在学习shell版本,在控制台中操作数据库。

1. 查找数据

1
db.banji.find(JSON条件)

寻找具体姓名的条目:

1
db.banji.find({"name":"小明"})

且逻辑,就是JSON中多几个项目就可以了:

1
db.banji0910.find({"sex":"男","age" : {$gt : 11}})

常见的符号$gt大于,$lt小于,$ne不等于,$in区间。

如果结构比较复杂,可以用连续打点语法。

或逻辑,寻找女生或者小于12岁的男生:

1
db.banji.find({$or : [{"sex" : "女"},{"age" : {$lt : 13}}]});

排序结果,用sort。

1
db.banji.find({$or : [{"sex" : "女"},{"age" : {$lt : 13}}]}).sort({"age":-1});

1表示正序,-1表示倒序。

2. 增加数据

1
db.banji.insert({"name":"小丹尼","age":32,"sex":"男"})

3. 更改数据

一定记住用$set引导。两个JSON,分别是更改谁、改为什么:

1
db.banji.update({"name":"小红"},{$set:{"sex" : "男"}})

更改多个条目:

1
db.banji0910.update({"sex":"男"},{$set : {"sex" : "女"}},{ multi: true})

4. 删除条目

仅仅删除一条:

1
db.restaurants.remove( { "borough": "Queens" }, { justOne: true } )

如果不写{justOne:true}就会删除所有匹配的。

删除所有年龄大于12岁的:

1
db.banji.remove({"age" : {$gt : 12}})

NodeJS 下使用 MongoDB

文档

首先npm上下载一个mongodb的模块,

1
npm install mongodb --save

标准DEMO:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//得到mongo客户端
var MongoClient = require('mongodb').MongoClient;
//数据库地址,最后的斜杠是数据库的名字
var dburl = 'mongodb://localhost:27017/student';

//链接数据库
MongoClient.connect(dburl, function(err, db) {
if(err){
console.log("链接失败");
return;
}
console.log("链接成功");
//检索banji0910集合中的所有文档
db.collection("banji0910").find({}).toArray(function(err,results){
console.log(results);
});
db.close();
});

所有的CRUD操作都应该在链接数据库的回调函数里面。

  • 插入数据:
1
2
3
4
5
6
7
8
9
10
db.collection("banji0910").insertOne(
{
"name":"小明",
"age":12,
"sex":"男"
}
,function(err,r){
console.log("成功插入" + r + "条数据");
}
);
  • 修改数据:
1
2
3
4
5
6
7
db.collection("banji0910").updateMany(
{"name":"小明"},
{$set : {"sex" : "女"}},
function(err,r){
console.log("成功修改" + r + "条数据");
}
);
  • 删除数据,删除所有条目:
1
2
3
4
5
6
db.collection("banji0910").removeMany(
{},
function(err,r){
console.log("成功删除" + r + "条数据");
}
);
  • 复杂查找:
1
2
3
4
5
db.collection("banji0910").find(
{$or : [{"sex":"女"},{"age" : {$lt : 13}}]}).toArray(function(err,arr){
console.log(arr);
}
);

表单提交

  • HTML表单页:
1
2
3
4
5
6
7
8
9
10
11
12
13
<form action="http://127.0.0.1:3000/form_post" method="post">
<p>
姓名:<input type="text" name="name">
</p>
<p>
年龄:<input type="text" name="age">
</p>
<p>
性别:<label><input type="radio" name="sex" value="男"></label>
<label><input type="radio" name="sex" value="女"></label>
</p>
<input type="submit" value="提交">
</form>
  • 数据库开机:

    1
    mongod --dbpath c:\MongoDBdata
  • 进入可视化工具使用数据库

  • 表单处理.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var express = require("express");
var formidable = require("formidable");
var app = express();

//当表单来了要做的事
app.post('/form_post',function(req,res){
//识别表单,使用 formidable 的API
var form = new formidable.IncomingForm();
form.parse(req,function(err,fields,files){
console.log(fields); //{ name: 'Beme', age: '22', sex: '男' }

});
});

app.listen(3000);

当HTML表单页做出提交时:控制台输出:

1
{ name: 'Beme', age: '22', sex: '男' }

  • 提交到 MongoDB 数据库
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
var express = require("express");
var formidable = require("formidable");
var MongoClient = require("mongodb").MongoClient;

var app = express();
var dburl = "mongodb://localhost:27017/student";

//当表单来了要做的事
app.post('/form_post',function(req,res){
//识别表单,使用 formidable 的API
var form = new formidable.IncomingForm();
form.parse(req,function(err,fields,files){
//连接数据库
MongoClient.connect(dburl,function(err,db){
if (err) {
console.log("数据库连接失败");
return;
}
//插入数据
db.collection("banji").insertOne(fields,function(err,r){
res.send("成功插入"+ r + "条数据");
});
db.close();
});

});
});

app.listen(3000);
------ 本文结束 ------
0%