MongoDB

MongoDB

数据库类型

  • 关系型数据库
  • 非关系型数据库

MongoDB简介

NoSQL简介

NoSQL(NoSQL = Not Only SQL ),意即”不仅仅是SQL”。

在现代的计算系统上每天网络上都会产生庞大的数据量。

这些数据有很大一部分是由关系数据库管理系统(RDBMS)来处理。 1970年 E.F.Codd’s提出的关系模型的论文 “A relational model of data for large shared data banks”,这使得数据建模和应用程序编程更加简单。

通过应用实践证明,关系模型是非常适合于客户服务器编程,远远超出预期的利益,今天它是结构化数据存储在网络和商务应用的主导技术。

NoSQL 是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势越发高涨。NoSQL的拥护者们提倡运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入。

MongoDB的安装

windows版本

参考地址:http://www.runoob.com/mongodb/mongodb-window-install.html

  • 1 根据操作系统选择合适的安装程序(32位或64位)
  • 2 直接安装程序
  • 3 配置环境变量,通过命令:mongod --version看是否安装成功
  • 4 注意:MongoDB最新版的安装包已经不再支持32位的windows操作系统了
1
2
3
4
5
6
解决mongodb安装时出错 “mongodb 无法启动此程序,因为计算机中丢失 api-ms-win-crt-runtime-l1-1-0.dll”,安装 vc_redist.x64.exe

https://helpx.adobe.com/tw/creative-cloud/kb/error_on_launch.html

通过指定其他电脑的ip地址,就可以使用其他电脑中的MongoDB数据库了:
var url = 'mongodb://localhost:27017'

mac版本

参考地址:http://www.runoob.com/mongodb/mongodb-osx-install.html

MongoDB的启动与连接

  • 1 通过命令:mongod 启动 mongodb数据库服务(不要关闭)
  • 2 重新开启一个cmd,输入命令:mongo 就可以连接到mongod服务了
1
2
3
4
1 在 C中创建 data文件夹, 在data文件夹中创建 db文件
2 在终端中输入命令: mongod ,就可以启动mongodb数据库服务了
3. 创建 c:\data\db 的目的: 告诉 mongodb 数据存储到这个文件夹中, 但是, 只能在C盘中启动 mongod
4. 如果需要在 D盘 启动, 需要在 D中也创建 data/db 目录
1
2
3
4
5
6
# 终端1 -- 启动服务
mongod

# 终端2 -- 连接到服务
# 此时,就可以在 终端 对数据库进行操作了
mongo

数据库存储路径的说明

  • windows32位系统 安装MongoDB
  • 注意:mongod 会在执行命令的磁盘根目录中查找 data/db 目录作为数据库文件存储路径
  • 可以通过命令:mongod --dbpath 路径 修改默认配置
1
2
3
4
5
6
# 64位:
mongod --dbpath C:\data\db

# 32位:
mongod --dbpath 数据存储路径 --journal --storageEngine=mmapv1
mongod --dbpath c:\data\db --journal --storageEngine=mmapv1

MongoDB终端操作

数据库操作

以下的命令都是在mongo终端下完成

  • 查看数据库
1
2
# 注意:自己创建的数据库,如果数据为空,不会显示
show dbs
  • 切换(创建)数据库
1
2
3
4
# 如果数据库存在,切换到该数据库, 如果数据库不存在,创建新的数据库
use 数据库名
use test
use users
  • 查看当前使用的数据库
1
db
  • 查看当前数据库的集合
1
show collections
  • 删除当前数据库
1
db.dropDatabase()

mongodb术语

  • 数据库:一个项目会使用一个数据库,比如letao, manager等
  • 集合:类似于表,一个数据库可以有很多集合,比如user存放学生信息,teacher存放老师的信息
  • 文档:一条数据就是一个文档,一个集合可以存放多条数据,即一个集合可以存放多个老师的信息,每个老师的信息称为一条文档
  • 字段:一条数据中的属性,就是字段,比如name,age等

插入数据(文档)

  • 语法:db.集合名称.insert({})
  • 说明: 在 mongodb 中不需要提前创建”表”, 直接通过 db.表名称.inseret() 就可以往表中添加数据了
1
2
3
4
5
# 插入一条
db.users.insert({name: 'jack', age: 18, gender: 'male'})

# 插入多条
db.users.insertMany([{name: 'tom', age: 19}, {name: 'jerry', age: 20}])

查询数据

  • 语法:db.集合名称.find()
1
2
3
4
5
6
7
8
# 查询所有数据
db.users.find()

# 美化输出格式:
db.集合名称.find().pretty()

# 指定条件查询:
db.集合名称.find({name: 'jack'})

修改数据

  • 语法:db.集合名称.updateOne(条件, 更新后的数据)
1
2
3
4
5
6
7
# 修改name属性为jack的数据,将age改为20
# 第一个参数: 表示要修改哪个数据, 会根据指定的name属性, 去查找值为jack的数据
# 第二个参数: 表示修改修改后的数据, 会修改 age 属性的值为 20
db.users.updateOne({name: 'jack'}, {$set: {age: 20}})

#修改age大于19岁的文档,将name设置为 中年人
db.users.updateMany({age: {$gt: 19}},{$set: {name: '中年人'}})

删除数据

  • 语法:db.集合名称.deleteOne(条件)
1
2
3
4
5
6
7
# 删除age为18的数据
# 删除第一条满足条件的数据
db.users.deleteOne({age: 18})

# 删除所有name为jack的数据
# 删除所有满足条件的数据
db.users.deleteMany({name: 'jack'})

MondoDB 查询语句

操作 格式 示例 SQL语句
等于 {} db.col.find({ name :’jack’}) where name = ‘jack’
小于 $lt db.col.find(&#123age: {$lt:18}&#125) where age < 18
小于或等于 $lte db.col.find(&#123age: {$lte:18}&#125) where age <= 18
大于 $gt db.col.find(&#123age: {$gt:18}&#125) where age > 18
大于或等于 $gte db.col.find(&#123age: {$gte:18}&#125) where age >= 18
不等于 $ne db.col.find(&#123age: {$ne:18}&#125) where age != 18

在node中操作MongoDB

安装:

1
npm install 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
30
31
32
33
34
35
36
/*
nodejs操作mongodb依赖与一个模块: mongodb
*/
//1. 导入
//mongodb的客户端,可以连接到mongodb的服务器
var MongoClient = require("mongodb").MongoClient;
//2. 连接mongodb的服务器
//连接mongodb服务器的一个地址
var url = 'mongodb://localhost:27017';
//需要连接的mongodb的数据库
//var dbName = "letao";
//参数1: mongodb服务器的地址
//参数2:回调函数
//err:表示连接失败的信息
//client:连接成功的一个对象
MongoClient.connect(url, function(err, client){
if(err) {
return console.log("连接服务器失败");
}

//表示需要使用乐淘数据库 use letao
var db = client.db("letao");

//1. 查询数据
//db.user.find();
db.collection("user").find().toArray(function(err, data){
if(err){
return console.log("获取数据失败");
}
console.log(data);
});

//关闭数据库
client.close();

});

数据增删改查

  • 增加数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//添加单条
db
.collection("users")
.insertOne({name:"jim1", age: 12, gender:"女"}, function(err, info){
if(info.result.ok === 1){}
console.log("数据插入成功");
});

//添加多条数据
db
.collection("users")
.insertMany([ {"name":"hucc", "age":18, gender:"男"}, {"name":"hcc", "age":17, gender:"女"} ], function(err, info){
console.log(info.result);
});
  • 删除数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//删除单条数据
db
.collection("users")
.deleteOne({age: {$gt:5}}, function(err, info){
if(info.result.ok === 1) {
console.log("数据删除成功");
}
})

//删除多条数据
db
.collection("users")
.deleteMany({age: {$gt:5}}, function(err, info){
if(info.result.ok === 1) {
console.log("数据删除成功");
}
});
  • 修改数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//修改单条数据
db
.collection("users")
.updateOne({name: "tom"}, {$set: {gender:"女"}}, function(err, info){
if(info.result.ok === 1) {
console.log("数据修改成功了");
}
})

//修改多条数据
db
.collection("users")
.updateMany({ name: "tom" }, { $set: { gender: "不详" } }, function (err, info) {
if (info.result.ok === 1) {
console.log("数据修改成功了");
}
});
  • 查询数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//查询
db.collection("users").find({age: {$gt:20}}).toArray(function(err, data){
if(err) {
return console.log("获取数据失败");
}
console.log(data);
});

db.collection("user").findOne({name:"小鲜肉"}, function(err, result){
if(err) {
console.log("查询单个数据失败了");
return;
}
console.log(result);
});

ObjectID

在MongoDB中,自动生成的_id,是一个ObjectID;

如果从数据库中获取的是一个带引号的字符串:”5b442e14d5827d4f6bbcba15”;

实际为’”5b442e14d5827d4f6bbcba15”‘ ;

1
2
var ObjectID = require("mongodb").ObjectID;
var id = new ObjectID(可以是24字节十六进制字符串,12字节二进制字符串或数字。);
  • 在MongoDB中,自动生成的_id,是一个ObjectID,并不是一个字符串或者数字;
  • var ObjectID = require("mongodb").ObjectID;
  • 可以通过new ObjectID(id);来创建一个ObjectID;
  • 参数id可以是24字节十六进制字符串,12字节二进制字符串或数字。

事件相关

Node.js中on和jQuery中的on没有关系;