MongoDB 是免费开源的跨平台 NoSQL 数据库,非关系数据库。与关系型数据库不同,MongoDB 的数据以类似于 JSON 格式的二进制文档存储。
非关系数据库和关系型数据库的区别是什么?
- 实质:非关系型数据库的实质:非关系型数据库产品是传统关系型数据库的功能阉割版,通过 减少用不到或很少用的功能,来大幅度提高产品性能。
- 价格:目前的非关系型数据库基本都是免费的,而比较有名气的关系型数据库都是收费的,比如:Oracle、DB2、MSSQL。MySql虽然是免费的,但是处理大型数据还是要提前作很多工作的。
- 功能:实际开发中,很多业务需求,其实并不需要完整的关系型数据库功能,非关系型数据库的功能就足够使用了。这种情况下,使用性能更高、成本更低的非关系型数据库当然是更明智的选择。
安装 MongoDB
运行MongoDB服务端:
启用服务的命令是:mongod
通过 shell 连接 MongoDB 服务:mongo
1.打开命令行:先打开运行(快捷键win+R),然后输入cmd后回车,就可以打开命令行工具。
2.执行mongod:在命令中直接输入mongod,但是你会发现服务并没有启动,报了一个exception,服务停止了。
3.新建文件夹:出现上边的错误,是因为我们没有Mongodb需要的文件夹,一般是安装盘的根目录,建立data/db,这两个文件夹。
4.运行mongod:这时候服务就可以开启了,链接默认端口是27017。
Mongo基本命令
查看存在数据库命令:show dbs
查看数据库版本命令:db.version()
use admin: 进入数据,成功会显示:switched to db admin。
show collections: 显示数据库中的集合。db:显示当前位置。
创建集合
MongoDB 创建数据库的语法格式如下:
1 | use DATABASE_NAME |
如果数据库不存在,则创建数据库,否则切换到指定数据库。
删除集合
语法:
1 | db.collection.drop() |
返回值
如果成功删除选定集合,则 drop() 方法返回 true,否则返回 false。
插入文档
语法:
1 | db.COLLECTION_NAME.insert(document) |
例:
1 | db.user.insert({"name":"frank","age":18}) |
2 | WriteResult({ "nInserted" : 1 }) // 插入成功 |
查询文档
语法:
1 | db.collection.find(query, projection) |
参数:
- query :可选,使用查询操作符指定查询条件
- projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。
例:
1 | db.user.find() |
2 | {"_id" : ObjectId("5db29925da796623a4bfb583"), "name" : "frank", "age" : 18} |
更新文档
语法:
1 | db.collection.update( |
2 | <query>, |
3 | <update>, |
4 | { |
5 | upsert: <boolean>, |
6 | multi: <boolean>, |
7 | writeConcern: <document> |
8 | } |
9 | ) |
参数:
- query : update的查询条件,类似sql update查询内where后面的。
- update : update的对象和一些更新的操作符(如$,$inc…)等,也可以理解为sql update查询内set后面的
- upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
- multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参+ 数为true,就把按条件查出来多条记录全部更新。
- writeConcern :可选,抛出异常的级别。
我们把上一条数据的 age 改成 20
1 | db.user.update({"name":"frank"},{"name":"frank","age":20}) |
2 | db.user.find() |
3 | { "_id" : ObjectId("5db29925da796623a4bfb583"), "name" : "frank", "age" : 20 } |
删除文档
语法:
1 | db.collection.remove( |
2 | <query>, |
3 | <justOne> |
4 | ) |
参数:
- query :(可选)删除的文档的条件。
- justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。
- writeConcern :(可选)抛出异常的级别。
例:
1 | db.user.remove({"name":"frank"}) |
2 | WriteResult({ "nRemoved" : 1 }) // 删除成功 |
删除数据库
db.dropDatabase( ):删除整个数据库,在删除库时,一定要先进入数据库,然后再删除。
Mongoose
Mongoose是设计用于异步环境的MongoDB对象建模工具。
安装
1 | npm install mongoose |
连接数据库
1 | const mongoose = require('mongoose'); |
2 | |
3 | mongoose.connect('mongodb://localhost/my_database', { |
4 | useNewUrlParser: true, |
5 | useUnifiedTopology: true |
6 | }); |
Schema
1 | const Schema = mongoose.Schema; |
2 | |
3 | const userModel = new Schema({ |
4 | username: { type: String, required: true }, |
5 | password: { type: String, required: true }, |
6 | email: String |
7 | }); |
Model
1 | var User = mongoose.model('userModel', userModel ); |
插入数据
1 | User.insertMany({ username: 'frank', password: 123123, email: '123456@163.com' }) |
2 | .then(data => { |
3 | console.log(data) |
4 | console.log('插入成功') |
5 | }).catch(err => { |
6 | console.log(err) |
7 | }) |
查询数据
1 | User.find().then((data) => { |
2 | console.log(data) |
3 | }); |
修改数据
‘$set’ 指定一个键的值,这个键不存在就创建它.可以是任何MondoDB支持的类型.
1 | User.update({ username: "frank" }, { $set: { username: "frank1" } }).then(() => { |
2 | console.log('修改成功') |
3 | }) |
‘$inc’增减修改器,只对数字有效.
1 | Model.update({ |
2 | 'age': 22 |
3 | }, { |
4 | '$inc': { |
5 | 'age': 1 |
6 | } |
7 | }); |
8 | // age = 23 |
‘$unset’ 同上取反,删除一个键
1 | Model.update({ |
2 | 'age': 22 |
3 | }, { |
4 | '$unset': { |
5 | 'age': '123' |
6 | } |
7 | }); |
8 | // 执行后: age键不存在 |
‘$push’ 给一个键push一个数组成员,键不存在会创建
1 | Model.update({ |
2 | 'age': 22 |
3 | }, { |
4 | '$push': { |
5 | 'array': 10 |
6 | } |
7 | }); |
8 | // 执行后: 增加一个 array 键,类型为数组, 有一个成员 10 |
‘$addToSet’ 向数组中添加一个元素,如果存在就不添加
1 | Model.update({ |
2 | 'age': 22 |
3 | }, { |
4 | '$addToSet': { |
5 | 'array': 10 |
6 | } |
7 | }); |
8 | // 执行后: array中有10所以不会添加 |
‘$each’ 遍历数组, 和 $push 修改器配合可以插入多个值
1 | Model.update({ |
2 | 'age': 22 |
3 | }, { |
4 | '$push': { |
5 | array': { |
6 | '$each': [1, 2, 3, 4, 5] |
7 | } |
8 | } |
9 | }); |
10 | // 执行后: array : [10,1,2,3,4,5] |
‘$pop’ 向数组中尾部删除一个元素
1 | Model.update({ |
2 | 'age': 22 |
3 | }, { |
4 | '$pop': { |
5 | 'array': 1 |
6 | } |
7 | }); |
8 | // 执行后: array : [10,1,2,3,4] tips: 将1改成-1可以删除数组首部元素 |
‘$pull’ 向数组中删除指定元素
1 | Model.update({ |
2 | 'age': 22 |
3 | }, { |
4 | '$pull': { |
5 | 'array': 10 |
6 | } |
7 | }); |
8 | // 执行后: array : [1,2,3,4] 匹配到array中的10后将其删除 |
删除数据
1 | User.remove().then(() => { |
2 | console.log('删除成功') |
3 | }) |
删除一条数据
1 | User.deleteOne().then(() => { |
2 | console.log('删除成功') |
3 | }) |