## 基本概念

 

### 集合(collection

 

集合类似于数组,可以在集合里存放文档

 

### 文档(document

 

文档数据库中最小的单位,我们存储和操作的内容都是文档

 

## 基本指令

 

#### show dbsshow 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})

```

 

其中10表示是否显示该列数值

 

## 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)

}

})

```