## 基本概念
### 集合(collection)
集合类似于数组,可以在集合里存放文档
### 文档(document)
文档数据库中最小的单位,我们存储和操作的内容都是文档
## 基本指令
#### show dbs(show databases)
展示当前的所有数据库
#### use 数据库名称
进入数据库
该数据库可以存在也可以不存在,当存入数据时会真正创建该数据库
#### db
展示当前所在数据库
#### show collections
显示当前数据库的集合
## CRUD操作
### 向数据库中插入文档
#### db.<collection>.insert(doc)
向集合中插入文档
其中,collection指集合名
```
db.stu.insert({name:"张三",age:20})
```
指向stu集合中插入一个json文档
每条json都会自动生成objectID,即主键
_id可以自己指定,这样数据库就不会自动生成主键
#### db.\<collection>.insertMnay()
插入多个文档对象,必须传入数组
#### db.\<collection>.insertOne()
插入一个文档对象
### 查询
#### db.\<collection>.find()
查询名为collection集合中的所有文档
find中可以传入一个或多个字段
```mongodb
db.<collecton>.find({age:16,name:"张三"})
```
##### .count()
统计查询到几个结果
```
db.stu.find({gender:"girl"}).count()
```
##### .length()
同count(),但count更多
在不加括号的情况下可以查看源码,如db.stu.find().count即可看到count()方法的源码
#### db.\<collection>.findOne()
如上,但只查询第一个
返回的是一个文档对象,可以直接通过`.`访问其中的属性
```
db.stu.findOne({gender:"girl"}).name
```
### 改动
#### db.\<collection>.update(查询条件,新对象)
如下:
```
db.stu.update({name:"测试"},{age:28})
```
需要注意的是,新的对象会完全覆盖掉老的对象,即原本的数据会消失
,上面的测试对象会被修改为{age:28}对象
注意,它只会修改第一个符合规则的文档
#### $set
如果需要修改指定的属性,可以使用修改符$来进行修改
```
db.stu.update(
{name:"测试"},
{$set:{
name:"张三"
}}
)
```
注意,它只会修改第一个符合规则的文档
#### $unset
用来删除文档的指定属性
#### db.\<collection>.updateMany()
同时需修改多个符合条件的文档
#### db.collection.updateOne()
### 删除
```
db.<collection>.roemove({})
db.<collection>.deleteOne({})
db.<collection>.deleteMany({})
```
括号中为条件
默认情况下,db.<collection>.roemove({})会删除所有符合条件的文档。但是如果给它传入第二个参数true,则只会删除一个
如果大括号中不传入参数则会清空该集合,如果不传入大括号则会报错
```
db.<collection>.drop()
```
删除该集合
```
db.dropDatabase()
```
删除数据库
## sort和投影
### sort
```
db.<collection>.find({}).sort({})
```
传入属性和数字,1表示升序,-1表示降序
可以传入多个值
```
db.<collection>.find({}).sort({age:1,_id:-1})
```
### 投影
find中可以传入多个参数
```
db.<collection>.find({},{name:1,_id:0})
```
其中1和0表示是否显示该列数值
## mongoose
mongoose是一个对象文档模型库,是对mongodb模块的进一步封装
mongoose的几个优点
1. 可以为文档添加一个约束
2. 数据可以通过类型转换转换为对象模型
3. 比原生的mongodb模块更容易驱动
mongoose中为我们提供了几个新的对象
1. Schema(模式对象)
Schema对象定义约束了数据库的文档结构
2. Model
Model对象作为集合中的所有文档的表示,相当于MongeDB数据库中的集合collection
3. Document
Document表示集合中的具体文档,相当于集合中的一个具体的文档
### mongoose的使用
#### 引入
```
npm i mongoose
```
#### 连接
```nodeJs
await mongoose.connect('mongodb://localhost/test')
```
mongodb是固定的,是连接协议
localhost是主机地址,如果不指定端口号会取默认27017
test是数据库名
#### 监听链接状态
在mongoose对象中有一个属性叫做connection,该对象表示的是数据库链接
通过监视该对象的状态,可以监听数据库的连接与断开
```
mongoose.connection.once("open",function(){})
//数据库连接成功的事件
```
```
mongoose.connection.once("close",function(){})
//数据库断开的状态
```
#### 断开连接
```js
mongoose.disconnect()
```
一般不适用
mongodb一般只需要连接一次,不需要断开
#### 创建schema(模式)对象
```
var schema = mongoose.Schema
var blogSchema = new Schema({
title:String,
author:String,
body:String,
comments:[{body:String,date:Date}]
})
```
可以设置默认值
```
const Schema = mongoose.schema
var stuSchema = new Schema({
name:String,
age:Number,
address:String,
gender:{
type:String,
default:"女"
}
})
```
#### 创建Model
```
var StuModel = mongoose.model("student","stuSchema")
```
传入两个值,第一个是集合名,第二个是约束名
#### 创建文档
```
StuModel.create({doc,function(err){}})
```
```
StuModel.create({{
name:"张三",
age:18,
address:"火星",
gender:"男"
},function(err){
if(!err){
console.log('插入成功')
}else{
}
}})
```
mongoose会自动将集合名转换为复数
#### Model的方法
##### 查询
- [Model.findById()](http://mongoosejs.net/docs/api.html#findbyid_findById)
- [Model.findOne()](http://mongoosejs.net/docs/api.html#findone_findOne)
懒得写了,如果复习到直接看文档吧
Model.find(condotions,[[projection],[options],[callback])
其中,condition表示查询的条件
projection表示投影
options查询选项
callback,回调函数
callback必传,因为需要回调函数获取结果
```
stuModel.find({name:"张三"},function(err,docs){
if(!err){
console.log(docs)
}
})
```
无论是否查到数值都会返回一个数组,因此如果要点出具体的值需要加[]
```js
stuModel.find(
{name:"张三"},
{name:1,_id:0},//投影,可以只传入字符串,用-隔开,如"name -age"
{skip:10,limit:1},//
function(err,docs){
if(!err){
console.log(docs)
}
})
```