一、简介
1.特点
- 是为了快速开发互联网Web应用而设计的数据库系统
- 是一种No SQL数据库(非关系型数据库),一种文档型数据库
- 所谓文档型数据库,是一种类似于JSON的结构,简单理解就是value可以存储二进制数据(BSON)
2.下载
下载地址:https://www.mongodb.org/dl/win32
注意:奇数版为测试版,偶数版为稳定版
- 安装mongodb
- 在根目录下创建配置文件 mongo.config
dbpath=D:\1tools\mongodb\data\db
logpath=D:\1tools\mongodb\data\log\mongo.log
3.配置文件详解
# 端口号,默认27017
#port=27017
# 数据库文件位置
dbpath=D:\1tools\mongodb\data\db
#日志文件位置
logpath=D:\1tools\mongodb\data\log\mongo.log
# 是否追加方式写入日志,默认True
logappend=true
# 设置绑定ip
bind_ip = 127.0.0.1
# 设置端口
port = 27017
# 是否以守护进程方式运行,默认false
fork = true
#这个选项可以过滤掉一些无用的日志信息,若需要调试使用请设置为false
quiet=false
# 启用日志文件,默认启用
journal=true
# 启用定期记录CPU利用率和 I/O 等待,默认false
#cpu = true
# 是否以安全认证方式运行,默认是不认证的非安全方式
#noauth = true
#auth = true
# 详细记录输出,默认false
#verbose = true
#用于开发驱动程序时验证客户端请求
#objcheck = true
# # 启用数据库配额管理,默认false
#quota = true
# 设置oplog日志记录等级,默认0
# 0=off (default)
# 1=W
# 2=R
# 3=both
# 7=W+some reads
#oplog = 0
# 是否打开动态调试项,默认false
#nocursors = true
# 忽略查询提示,默认false
#nohints = true
# 禁用http界面,默认为localhost:28017
#nohttpinterface = true
# 关闭服务器端脚本,这将极大的限制功能,默认false
#noscripting = true
# 关闭扫描表,任何查询将会是扫描失败
#notablescan = true
# 关闭数据文件预分配
#noprealloc = true
# 为新数据库指定.ns文件的大小,单位:MB
# nssize = <size>
# 用于Mongo监控服务器的Accout token。
#mms-token = <token>
# Mongo监控服务器的服务器名称。
#mms-name = <server-name>
# Mongo监控服务器的Ping间隔时间,即心跳
#mms-interval = <seconds>
# Replication Options
# 设置主从复制参数
#slave = true # 设置从节点
#source = master.example.com # 指定从节点的主节点
# Slave only: 指定要复制的单个数据库
#only = master.example.com
# or
#master = true # 设置主节点
#source = slave.example.com
# 设置副本集的名字,所有的实例指定相同的名字属于一个副本集
replSet = name
#pairwith = <server:port>
# 仲裁服务器地址
#arbiter = <server:port>
# 默认为false,用于从实例设置。是否自动重新同步
#autoresync = true
# 指定的复制操作日志(OPLOG)的最大大小
#oplogSize = <MB>
# 限制复制操作的内存使用
#opIdMem = <bytes>
# 设置ssl认证
# Enable SSL on normal ports
#sslOnNormalPorts = true
# SSL Key file and password
#sslPEMKeyFile = /etc/ssl/mongodb.pem
#sslPEMKeyPassword = pass
# path to a key file storing authentication info for connections
# between replica set members
#指定存储身份验证信息的密钥文件的路径
#keyFile=/path/to/keyfile
二、基本操作
1.基本指令
- 显示所以的数据库
show dbs
show databases
- 使用数据库
use [数据库名]
- 显示当前所属数据库
db
- 显示数据库中所有的集合
show collections
2.CRUD操作
(1) 插入操作
db.<集合名称>.insert(<文档>)
举例:向test数据库的stu集合插入一个学生对象或多个学生对象
- 插入一个
use test
db.stu.insert({name:"Jerry",age:18,gender:"male"})
- 插入多个
use test
db.stu.insert([
{name:"Jerry",age:18,gender:"male"},
{name:"Tom",age:16,gender:"male"},
])
当我们没有给文档指定 “_id” 属性时,数据库会自动为文档增加该属性
该属性是文档的唯一表示
ObjectId()
会返回一个唯一的Id
insertOne和insertMany是对insert的一个拆分
(2) 查询操作
db.<集合名称>.find(<条件对象>)
- 查询stu中所有的文档
db.stu.find()
- 查询name属性为“Jerry”且age属性为18的文档
db.stu.find({name:"Jerry",age:18})
- find()返回的是一个数组,可以在最后加上中括号来指定第几个文档
例如:
db.stu.find({name:"Jerry",age:18})[0]
- findOne()返回的就是一个文档,相当于find(<条件>)[0]
findOne()可以直接在最后指定某一条属性,例如findOne(<条件>).name - find(<条件>).count() ,
find(<条件>).length()
可以得到满足条件文档的数量
如果条件中的字段对应文档中的一个数组,那么value只要在这个数组中就满足条件
条件查询
Name | Description |
Matches values that are equal to a specified value.相等 | |
Matches values that are greater than a specified value.大于 | |
Matches values that are greater than or equal to a specified value.大于等于 | |
Matches any of the values specified in an array.在数组内 | |
Matches values that are less than a specified value.小于 | |
Matches values that are less than or equal to a specified value.小于等于 | |
Matches all values that are not equal to a specified value.数组属性中的值全不等于 | |
Matches none of the values specified in an array.不在数组内 |
//举例
db.stu.find({name:"Jerry",age:{$lt:18}})
//查询名字为Jerry且年龄大于18的
//举例
db.stu.find({$or:[{age:{$lt:16}},{age:{$lt:18}]})
//查询年龄大于18或小于16的
(3) 修改操作
db.<集合名称>.update(<查询条件>,<新对象>)
update默认使用新对象替换旧对象
举例:
// 修改前
// stu集合 --> {name:"Jerry",age:18,gender:"male"}
// stu集合 --> {name:"Tom",age:16,gender:"male"}
db.stu.update({name:"Tom"},{age:13})
//修改后
// stu集合 --> {name:"Jerry",age:18,gender:"male"}
// stu集合 --> {age:13}
如果需要修改指定属性,需要使用修改标识符
$set – 用于增加或修改指定属性
$unset – 用于删除指定属性
$push – 向数组中增加一个元素(可重复)
$addToSet – 向数组中增加一个元素(不可重复)
举例:
db.stu.update(
{name:"Jerry"},
{
$set:{
age:"13"
}
}
)
update默认情况下只会修改一个文档,修改多条文档时要用updateMany,或者添加update的第三条属性
db.stu.update(
{name:"Jerry"},
{
$set:{
age:"13"
}
},
{
multi:true
}
)
其他修改标识符查看官网
(4) 删除操作
db.<集合>.remove(<条件>)
db.<集合>.deleteOne(<条件>)
db.<集合>.deleteMany(<条件>)
remove、delete的条件与find相同
remove默认删除多个,它的第二个参数为boolean类型的,当值为true时只删除一个
remove必须传入参数,如果要删除所有则传入一对空的大括号(性能差),一般使用删除整个集合来删除所有记录
db.<集合>.drop()
此外,删除数据库是
db.dropDatabase()
(5) 其他操作
db.<集合>.repalceOne(<条件>,<要替换的新文档>)
替换一个文档
三、sort和映射
3.1 sort
可以通过sort对查询的结果进行排序
db.test.find({}).sort({<排序的属性>:<1或-1> , ...})
其中1代表升序,-1代表降序
3.2 映射
基本用法:
db.test.find({},{<映射的属性>:<0或1> , .....})
其中1代表显示,0代表不显示
举例:
db.test.find({},{name:1,_id:0})
四、Mongoose
4.1 安装和数据库的连接
安装:
npm i mongoose --save
连接
const mongoose = require("mongoose")
mongoose.connect("mongodb:/localhost/test",{useMongoClient:true})
监听连接状态
//监听连接成功
mongoose.connection.once("open",()=>{
console.log("连接成功~~~")
})
//监听断开连接
mongoose.connection.once("close",()=>{
console.log("断开连接~~~")
})
//手动断开连接
mongoose.disconnect()
4.2 Schema与Model
Schema:用于规定文档的结构的,每个schema对应数据库中的一个集合的结构,它不能用于直接操作数据库。
Model:对应数据库中的一个集合,可以用于对集合进行操作。
使用步骤:
const mongoose = require("mongoose")
mongoose.connect("mongodb:/localhost/student",{useMongoClient:true})
//获取Schema
const Schema = mongoose.Schema
//创建一个集合的Schema
let stuSchema = new Schema({
name:String,
age:Number,
gender:{
type:String,
default:"male"
}
})
//获取Model
const Model = mongoose.Model
//通过Schema创建一个Model
let StuModel = Model("student",stuSchema)
//通过StuModel对数据库进行操作
StuModel.create({name:"小明",age:18},(err)=>{
if(!err){
console.log("数据插入成功~~~")
}
})
Schema的参数是一个对象,属性为对集合的属性名,值为该属性的类型,值也可以是一个类似于上例的对象,用于规定该属性的默认值。
Model的第一个参数是集合的名称,第二个参数是一个Schema的对象实例,最终返回一个对应某一集合的Model,该Model可对集合进行操作。
4.3 Schema详讲
此小章中的StuSchema默认为4.2中用例中创建的。
更多关于Schema的API参照mo ngoose官方文档
4.3.1 添加文档
Model.create(dos , [callback])
用于添加一个或多个文档
举例:
//向student集合中添加两个文档
StuModel.create([{name:"小明",age:16,gender:"male"},}{name:"小红",age:18,gender:"female"}],(err,docs)=>{
if(!err){
console.log("插入成功")
}
})
第一个参数为一个数组,数组中是根据Schema格式的文档
第二个参数是一个回调函数,回调函数的第一个参数是错误信息,第二个参数添加的文档
4.3.2 查询文档
此处document(文档)是对应Model的实例
Model.find(condition,[映射的属性],[option],[callback])
用于查询文档,回调函数的第二个参数会返回一个文档数组
举例:
//查找年龄大于18的文档,并只显示名称和年龄的前3条数据
StuModel.find({age:{>:18}},"name age -_id",{limit:3},(err,docs)=>{
if(!err){
console.log(docs)
}
})
//此处第二个参数可以按照mongodb原来的 {name:1,age:1,_id:0} ,也可以把要先显示的属性用空格隔开,不显示的前面加 "-"。
Model.findOne(condition,[映射的属性],[callback])
用于查询一个文档,回调函数的第二个参数会返回一个文档
举例:
//查找名字为小明的第一个文档
StuModel.findOne({name},(err,docs)=>{
if(!err){
console.log(docs)
}
})
Model.findById(id,[映射的属性],[callback])
通过Id查询文档,回调函数的第二个参数会返回一个文档
举例:
//查找id值为asdasdasd的文档
StuModel.findById("asdasdasd",(err,docs)=>{
if(!err){0
console.log(docs)
}
})
4.3.3 修改文档
Model.update(condition,newDoc,[callback])
修改符合条件的文档
Model.update({name:"小明"}, { &set:{name:"大明"}},{multi:true}, (err)=>{
if(!err){
console.log("修改成功")
}
});
Model.updateOne(condition,newDoc,[callback])
修改符合条件的一个文档
Model.updateOne({name:"小明"}, { &set:{name:"大明"}}, (err)=>{
if(!err){
console.log("修改成功")
}
});
Model.updateMany(condition,newDoc,[callback])
修改符合条件的多个文档
Model.updateMany({name:"小明"}, { $set:{name:"大明"}}, (err)=>{
if(!err){
console.log("修改成功")
}
});
4.3.4 删除文档
Model.deleteOne(conditions,[callback])
删除一个文档
Model.deleteOne({name:"小明"}, (err)=>{
if(!err){
console.log("删除成功")
}
});
Model.deleteMany(conditions,[callback])
删除多个文档
Model.deleteMany({name:"小明"}, (err)=>{
if(!err){
console.log("删除成功")
}
});
4.4 Document(文档)
文档是Schema的实例对象,一个Document对象就对应数据库中的一个文档。
文档的创建是通过某个集合的Schema得到的,以Student集合举例
//创建文档,通过Schema创建的文档会自动添加_id属性
let stu1 = new StuSchema({name:"小红",age:16,gender:"female"})
//在student集合中保存文档(文档存在则用当前文档覆盖掉数据库中的文档,不存在则新建)
stu1.save()
Document有五个常用的方法save(),update(),remove(),get(),set()
save()用于将当前文档的状态保存在数据库中
update()与Schema对象的update用法一致,但少了第一个参数,更新后文档不会在数据库中保存,需要再调用save()
remove()与Schema对象的remove用法一致,但少了第一个参数
get()是获取该文档的某一属性,参数只有一个属性名称
set()是修改该文档的某一属性,第一个参数是属性名称,第二个参数是新的值
举例:
let stu;
//用stu获取文档
StuSchema.findOne({},(err,doc)=>{
if(!err){
stu = doc;
}
})
//文档中的数据 -> {_id:"asdasdasd",name:"小明",age:18;gender:"male"}
stu.set("name","小小明")
let name = stu.get("name");
console.log(name) //输出 -> 小小明
stu.update({$set:{age:20}},err=>{
if(!err){
console.log("修改成功")
}
})
//文档中的数据 -> {_id:"asdasdasd",name:"小明",age:18;gender:"male"}
stu.save();
//文档中的数据 -> {_id:"asdasdasd",name:"小小明",age:20;gender:"male"}
stu.remove();
//文档中该条数据被删除