Mongoose

mongodb————Mongoose

Mongoose 是一个对象文档模型(ODM)库,它对 Node 原生的 MongoDB 模块进行了进一步的优化封装,并提供了更多功能。Mongoose 就是让我们通过 Node 来操作 MongoDB 的模块

Mongoose 为我们提供几个新的对象:(关系顺序:Schema->Model->Document)

  1. Schema(模式对象):Schema 对象定义约束了数据库中的文档结构
  2. Model:Model 对象作为集合中的所有文档的表示,相当于 MongoDB 数据库中的集合 collection
  3. Document:Document 表示集合中具体的文档,相当于集合中的一个具体文档
使用 Mongoose
  1. 在项目中安装
    npm install mongoose --save
  2. 引入
    var mongoose = require('mongoose')
  3. 连接 MongoDB 数据库
    mongoose.connect('mongodb://数据库ip地址:端口号/数据库名', {useNewUrlParser: true, useUnifiedTopology: true})
    如果端口号是默认端口号(27017),则可以省略不写
  4. 断开数据库连接(一般不需要使用)
    mongoose.disconnect()
    PS:MongoDB 数据库一般情况下,只需要连接一次,连接一次后,除非项目停止服务器关闭,否则不会断开
监听 MongoDB 数据库的连接状态

在 mongoose 对象中,有一个属性叫做connection,该对象表示的就是数据库连接,通过监听该对象的状态,可以监听数据库的连接与断开

数据库连接成功的事件
mongoose.connection.once("open", function(){});
数据库断开的事件
mongoose.connection.once("close", function(){});

Schema 和 Model 的具体操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//将mongoose.Schema赋值给一个变量
var Schema = mongoose.Schema;

//创建Schema对象
var stuSchema = new Schema({
  name: String,
  age: Number,
  gender: {
    type: String,
    default: "female",
  },
  address: String,
});

//通过Schema来创建Model(Model代表数据库中的集合,通过Model才能对数据库进行操作)
//mongoose.Model(modelname,schema)
// modelname:要映射的集合名(mongoose会自动将集合名变成复数);
// scheam:对应哪个模型
var stuModel = mongoose.model("student", stuSchema);

Model 的方法

一、增

Model.create(doc(s), [callback]):用来创建一个或多个文档并添加到数据库中

参数:
doc(s):可以是一个文档对象,也可以是一个文档对象的数组
callback:当操作完成以后调用的回调函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
stuModel.create(
  [
    {
      name: "LiLy",
      age: 20,
      gender: "female",
      address: "ShangHai",
    },
    {
      name: "Jhon",
      age: 22,
      gender: "male",
      address: "NewYork",
    },
  ],
  (err) => {
    if (!err) {
      console.log(arguements);
      console.log("插入成功...");
    }
  }
);
二、查

1. Model.find(conditions, [projection], [options], [callback]):查询所有符合条件的文档,返回数组
2. Model.findById(id, [projection], [options], [callback]):根据文档的 id 属性查询文档
3. Model.findOne([conditions], [projection], [options], [callback]):查询符合条件的第一个文档,返回具体的文档对象

参数:
conditions:查询条件
projection:投影需要获取的字段,两种方式:1.{name:1, _id:0} 2.”name -_id”
options:查询选项(skip limit)
callback:回调函数,查询结果通过回调函数返回

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
stuModel.find(
  {
    age: 18,
  },
  "name age -_id",
  { skip: 2, limit: 1 },
  (err, docs) => {
    if (!err) {
      console.log(docs);
    }
  }
);
//--------------------------------------
stuModel.findById("5e7a156435bace7880a78590", (err, doc) => {
  if (!err) {
    console.log(doc);
  }
});
三、改

1. Model.update(conditions, doc, [options], [callback]):修改一个或多个文档
2. Model.updateMany(conditions, doc, [options], [callback]):修改多个文档
3. Model.updateOne(conditions, doc, [options], [callback]):修改一个文档
4. Model.replaceOne(conditions, doc, [options], [callback]):替换一个文档

参数:
conditions:查询条件
doc:修改后的对象 options:配置参数
callback:回调函数

1
2
3
4
5
stuModel.update({ name: "LiLy" }, { $set: { age: 33 } }, (err) => {
  if (!err) {
    console.log("修改成功");
  }
});
四、删

1. Model.remove(conditions, [callback]):删除一个或多个文档
2. Model.deleteOne(conditions, [callback]):删除多个文档
3. Model.deleteMany(conditions, [callback]):删除一个文档

参数:
conditions:条件
callback:回调函数

1
2
3
4
5
stuModel.remove({ name: "LiLy" }, (err) => {
  if (!err) {
    console.log("删除成功");
  }
});
五、其他

1. Model.count(conditions, [callback]):统计文档数量

参数:
conditions:条件
callback:回调函数

1
2
3
4
5
stuModel.count({}, (err, count) => {
  if (!err) {
    console.log(count);
  }
});

Document 对象的方法

Document 和集合中的文档一一对应,Document 是 Model 的实例,通过 Model 查询到结果都是 Document
创建一个 Document

1
2
3
4
5
6
var stu = new stuModel({
  name: "Amy",
  age: "21",
  gender: "female",
  address: "GuangZhou",
});

1.save([callback]):保存文档

1
2
3
4
5
stu.save((err) => {
  if (!err) {
    console.log("保存成功");
  }
});

2.update(update, [options], [callback]):修改文档
3.remove([callback]):删除文档

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//修改和删除例子
stuModel.findOne({}, (err, doc) => {
  if (!err) {
    doc.update({ $set: { age: 100 } }, (err) => {
      //修改
      if (!err) {
        console.log("修改成功");
      }
    });
    doc.remove((err) => {
      //删除
      if (!err) {
        console.log("删除成功");
      }
    });
  }
});

4.toJson():将 Document 对象转换为普通的 JSON 对象
5.toObject():将 Document 对象转换为普通的 JS 对象,注意:转换为普通的 JS 对象以后,所有的 Document 对象的方法或属性都不能使用



-->