序
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
MongoDB
打开cmd命令行窗口
- 输入 mongod 启动mongodb服务器
在打开一个cmd窗口
- 输入 mongo 连接mongodb ,出现 >
还可以自定义data存储的路径和端口
- mongod –dbpath 数据库路径 –port 端口号
将MongoDB设置为系统服务,可以自动在后台启动,不需要每次都手动启动
在此之前在data目录下新建db和log文件夹,在D:\mongoDB\serve\3.2\目录下创建mongod.cfg,并写入
1
2
3
4
5systemLog:
destination: file
path: D:\data\log\mongod.log
storage:
dbPath: D:\data\db以管理员身份打开命令行窗口,执行如下的命令
sc.exe create MongoDB binPath= “"D:\mongoDB\serve\3.2\bin\mongod.exe" –service –config="D:\mongoDB\serve\3.2\mongod.cfg"“ DisplayName= “MongoDB” start= “auto”
sc.exe create MongoDB binPath= “"mongod的bin目录\mongod.exe" –service –config="mongo的安装目录\mongod.cfg"“ DisplayName= “MongoDB” start= “auto”
在任务管理器启动mongodb服务
数据库(database)
数据库的服务器
- 服务器用来保存数据
- mongod 用来启动服务器
数据库的客户端
- 客户端用来操作服务器,对数据进行增删改查的操作
- mongo 用来启动客户端
基本概念
- 数据库(database)
- 集合(collection)
- 文档(document)
- 在MongoDB中,数据库和集合都不需要手动创建,
当我们创建文档时,如果文档所在的集合或数据库不存在会自动创建数据库和集合
- 在MongoDB中,数据库和集合都不需要手动创建,
- Scheme、model、collection、document是其中的四大元素。document是MongoDB里的基本存储单位,collection是众多同类document的集合。Schema定义了一类document的模板,让这一类document在数据库中有一个具体的构成、存储模式。而Schema仅仅是定义了Document是什么样子的,至于生成document和对document进行各种操作(增删改查)则是通过相对应的model来进行的
- 基本指令
- show dbs
- show databases
- 显示当前的所有数据库
- use 数据库名
- 进入到指定的数据库中
- db
- db表示的是当前所处的数据库
- show collections
- 显示数据库中所有的集合
数据库的CRUD(增删改查)的操作
插入文档
db.collection.insert()
- 向集合中插入一个或多个文档
- 当我们向集合中插入文档时,如果没有给文档指定_id属性,则数据库会自动为文档添加_id,该属性用来作为文档的唯一标识
- _id我们可以自己指定,如果我们指定了数据库就不会在添加了,如果自己指定_id 也必须确保它的唯一性
db.collection.insertOne()
- 插入一个文档对象
db.collection.insertMany()
- 插入多个文档对象
删除文档
db.collection.remove()
- 删除一个或多个,可以第二个参数传递一个true,则只会删除一个
- 如果传递一个空对象{}作为参数,则会删除所有的
db.collection.deleteOne()
db.collection.deleteMany()
db.collection.drop()
- 删除集合
db.dropDatabase()
- 删除数据库
一般数据库中的数据都不会删除,所以删除的方法很少调用
一般会在数据中添加一个字段,来表示数据是否被删除
查询文档
db.collection.find()
- find()用来查询集合中所有符合条件的文档
- find()可以接收一个对象作为条件参数
- {} 表示查询集合中所有的文档
- {属性:值} 查询属性是指定值的文档
- find()返回的是一个数组
db.collection.findOne()
- 用来查询集合中符合条件的第一个文档
- findOne()返回的是一个文档对象
db.collection.find({}).count()
- 查询所有结果的数量
MongoDB支持直接通过内嵌文档的属性进行查询,如果要查询内嵌文档则可以通过.的形式来匹配
如果要通过内嵌文档来对文档进行查询,此时属性名必须使用引号
查询文档时,默认情况是按照_id的值进行排列(升序)
- sort()可以用来指定文档的排序的规则,sort()需要传递一个对象来指定排序规则 1表示升序 -1表示降序
- limit skip sort 可以以任意的顺序进行调用
- 在查询时,可以在第二个参数的位置来设置查询结果的投影,1表示显示该字段,0表示不显示
修改文档
db.collection.update(查询条件,新对象)
- update()默认情况下会使用新对象来替换旧的对象
- 如果需要修改指定的属性,而不是替换需要使用“修改操作符”来完成修改
- update()默认只会修改一个
db.collection.updateMany()
- 同时修改多个符合条件的文档
db.collection.updateOne()
- 修改一个符合条件的文档
db.collection.replaceOne()
- 替换一个文档
修改器
- $set
- 修改器用来指定一个键值。如果这个键不存在,则创建他
- 修改内嵌文档
- $unset
- 用于将键删除
- $push
- 用于向数组中添加一个新的元素
- $addToSet
- 向数组中添加一个新元素,如果数组中已经存在了该元素,则不会添加
- $each
- 和$addToSet修改结合起来用,可以一次添加多个不同的值
- $pop
- 从数组中删除元素,他可以从数组中的任何一端删除元素
- $pull
- 基于特定条件来删除元素。
- $inc
- 用来增加或减少已有的键的键值((只能为满足要求的数字)),或者在键不存在的时候创建一个键
- $ne
- 如果一个值不在数组里面就把他加进去,如果在不添加
- $gt:大于
- $lt:小于
- $gte:大于或等于
- $lte:小于或等于
- $inc:自增
Mongoose
- Mongoose就是一个让我们可以通过node来操作mongodb的模块
- Mongoose官方文档
下载安装Mongoose
- npm i mongoose –save
在项目中引入mongoose
- var mongoose = require(“mongoose”);
连接MongoDB数据库
- mongoose.connect(‘mongodb://数据库的ip地址:端口号/数据库名’, { useMongoClient: true});
- 如果端口号是默认端口号(27017) 则可以省略不写
断开数据库连接(一般不需要调用)
MongoDB数据库,一般情况下,只需要连接一次,连接一次以后,除非项目停止服务器关闭,否则连接一般不会断开
- mongoose.disconnect()
监听MongoDB数据库的连接状态
- 在mongoose对象中,有一个属性叫做connection,该对象表示的就是数据库连接,通过监视该对象的状态,可以来监听数据库的连接与断开
数据库连接成功的事件
- mongoose.connection.once(“open”,function(){});
数据库断开的事件
- mongoose.connection.once(“close”,function(){});
Schema
1 | 例子: |
Model
- 有了Model,我们就可以来对数据库进行增删改查的操作了
Model.create(doc(s), [callback])
- 用来创建一个或多个文档并添加到数据库中
- 参数:
- doc(s) 可以是一个文档对象,也可以是一个文档对象的数组
- callback 当操作完成以后调用的回调函数
查询:
通过find()查询的结果,返回的对象,就是Document文档对象
Model.find(conditions, [projection], [options], [callback])
- 查询所有符合条件的文档 总会返回一个数组
Model.findById(id, [projection], [options], [callback])
- 根据文档的id属性查询文档
Model.findOne([conditions], [projection], [options], [callback])
查询符合条件的第一个文档 总和返回一个具体的文档对象
- conditions 查询的条件
- projection 投影 需要获取到的字段
- 两种方式
- {name:1,_id:0}
- “name -_id”
- 两种方式
- options 查询选项(skip limit)//跳过,显示的最大数量{skip:3 , limit:1}
- callback 回调函数,查询结果会通过回调函数返回
- 回调函数必须传,如果不传回调函数,压根不会查询
修改
- Model.update(conditions, doc, [options], [callback])
- Model.updateMany(conditions, doc, [options], [callback])
- Model.updateOne(conditions, doc, [options], [callback])
- 用来修改一个或多个文档
- 参数:
- conditions 查询条件
- doc 修改后的对象
- options 配置参数
- callback 回调函数
- Model.replaceOne(conditions, doc, [options], [callback])
删除:
- Model.remove(conditions, [callback])
- Model.deleteOne(conditions, [callback])
- Model.deleteMany(conditions, [callback])
统计文档的数量
- Model.count(conditions, [callback])
1 | 例子: |
Document
- Document对象是Model的实例(可以用instanceof验证)
- Document 和 集合中的文档一一对应 , Document是Model的实例
- 通过Model查询到结果都是Document
- document的方法
- Model#save([options], [function])
- 和model的create作用相同,但是document只能用save
- update(update,[options],[callback])
- 和model的create作用相同,但是document只能用save
- Model#save([options], [function])
- 定义一个连接数据库的模块
1
2
3
4
5var mongoose = require("mongoose");
mongoose.connect("mongodb://数据库的ip地址:端口号/数据库名",{useMongoClient:true});
mongoose.connection.once("open",function () {
console.log("数据库连接成功~~~");
}); - 其他模块直接通过require引入该模块即可