在上一篇我们讲了如何通过Mongoose想数据库动态添加数据, 接下来我们一起来看一下如何通过Mongoose来对数据库进行增删改查等一系列操作

Model 对象的方法
  • remove(cinditions,callback)
  • deleteOne(conditons.callback)
  • deleteMant(conditions,callback)
  • find(conditions,projection,options,callback)
  • findById(id,projection,options,callback)
  • findOne(conditions,projection,options,callback)
  • count(conditions,callback)
  • create(doc,callback)
  • update(conditions,doc,options,callback)
  • 等等

1. 前置代码

// 引入mongoose模块
const mongoose = require("mongoose");

// 连接数据库
mongoose.connect("mongodb://localhost:27017/test",{useNewUrlParser: true ,useUnifiedTopology: true});

// 测试是否连接成功
mongoose.connection.once("open", function () {
    // 连接成功执行
    console.log('连接成功~');
});

// 创建Schema对象, 赋值给一个变量
const Schema = mongoose.Schema;

// 创建Schema(模式)对象
const stuSchema = new Schema({
    name: String,
    age: Number,
    gender: {
        type:String,
        default:'男'
    },
    address:String
});

// 通过Scheme来创建Model
// Model代表的是数据库中的集合, 通过Model才能对数据库进行操作
// mongoose.model(modelName,schema);
// modelName: 就是要映射的集合名称, mongoose会自动将集合名变成复数
// schema: 创建的Schema对象


const stuModel = mongoose.model('student', stuSchema);


2. 查询文档

演示:

  • find(conditions,[projection],[options],[callback]) - 查询所有符合条件的文档
stuModel.find({}, {name:1,_id:0}, function (err,docs) {
    if (!err) {
        console.log(docs)
    }
})

运行结果:
MongoDB学习笔记三 - Mongoose API的使用_json

{skip:3,limit:1}: 表示跳过三条数据, 显示一条数据
stuModel.find({}, { name: 1, _id: 0 }, {skip:3,limit:1},function (err,docs) {
    if (!err) {
        console.log(docs)
    }
})

MongoDB学习笔记三 - Mongoose API的使用_更新数据_02


  • findById(id,[projection],[options],[callback])- 根据文档的_id属性查询文档
stuModel.findById("611a9aa01647216accf385fa", function (err, docs) {
    console.log(err)
    if (!err) {
        console.log(docs)
    }
})

MongoDB学习笔记三 - Mongoose API的使用_json_03


  • findOne(conditions,[projection],[options],[callback]) - 查询符合条件的第一个文档
stuModel.findOne({}, { name: 1 },function (err,docs) {
    if (!err) {
        console.log(docs)
    }
});

MongoDB学习笔记三 - Mongoose API的使用_数据库_04

参数解析:

  • conditions: 查询条件
  • projection: 投影
    • 两种方式,下面两种方式所投影出来的效果是一样的
    • {name:1,_id:0}
    • "name -_id
  • options: 查询选项(skip, limit)
  • callback: 回调函数, 查询结果会通过回调函数返回

**注意:**通过find() 查询的结果, 返回的对象, 就是Document 文档对象
Document对象是Model的实例
验证代码如下:

stuModel.findById("611a9aa01647216accf385fa", function (err, docs) {
    if (!err) {
        console.log(docs instanceof stuModel)
    }
})

MongoDB学习笔记三 - Mongoose API的使用_json_05


3. 修改文档

  • update(conditions,doc,[options],callback)
  • updateMany(conditions,doc,[options],callback)
  • updateOne(conditions,doc,[options],callback)
  • replaceOne(conditions,doc,[options],callback) - 使用给定文档替换现有文档

参数

  • conditions: 查询条件
  • doc: 修改后的对象
  • options: 配置参数
  • callback: 回调函数
// 修改_id为611a9aa01647216accf385fa的数据,将name改为张三
stuModel.update({ _id: '611a9aa01647216accf385fa' }, { $set: { name: '张三' } },function (err,doc) {
    console.log(err, doc);
});

MongoDB学习笔记三 - Mongoose API的使用_更新数据_06
MongoDB学习笔记三 - Mongoose API的使用_更新数据_07


4. 删除文档

  • remove(cinditions,callback)
  • deleteOne(conditons.callback)
  • deleteMant(conditions,callback)
// 删除文档中 name: '张三' 的数据
stuModel.remove({ name: '张三' }, function (err, doc) {
    if (!err) {
        console.log(doc);
        console.log('删除成功')
    }
})

MongoDB学习笔记三 - Mongoose API的使用_数据库_08

补充

  • Model.count(conditions , callback )
    • conditions : 条件
    • callback: 回调函数
stuModel.count({ name: '小明' }, function (err, count) {
    console.log(count);
} )

MongoDB学习笔记三 - Mongoose API的使用_数据_09

Document文档对象
  • 通过Model对数据库进行查询时, 会返回Document对象或Document对象组合
  • Document继承自Model,代表一个集合中的文档
  • Document对象也可以和数据库进行交互操作

Document对象的方法

  • equals(doc)
  • id
  • get(path,[type])
  • set(path,value,[type])
  • update(update,[options,callback])
  • save([callback])
  • remove([callback])
  • isNew
  • isInit(path)
  • toJSON()
  • toObject()

前置代码同上:
演示

1. 插入数据

  • save([callback])
const stuModel = mongoose.model('student', stuSchema);


// 创建一个Document
var stu1 = new stuModel({
    name: '路明非',
    age: 24,
    gender: '男',
    address:'卡塞尔学院'
});

// console.log(stu1);

// 调用document API 将数据保存到数据库
stu1.save(function (err) {
    if (!err) {
        console.log('保存成功');
    }
})

MongoDB学习笔记三 - Mongoose API的使用_数据库_10
MongoDB学习笔记三 - Mongoose API的使用_更新数据_11


2. 更新数据

  • update(update,[options,callback])
// Mongoose中的方法也可以使用promise的方式
stuModel.findOne({}).then(res => {
    res.update({ $set: { age: 22 } }).then(res => {
        console.log('修改成功');
    })
})
// 更新数据方法二
stuModel.findOne({}).then(res => {
    res.age = 25;
    res.save();
})

  • set(path,value,[type]): 根据当前document对象设置对应属性值
// set()
stuModel.findOne({ name: '楚子航' }).then(res => {
    console.log(res.set("age",15));
})

MongoDB学习笔记三 - Mongoose API的使用_数据库_12

3. 删除数据

  • remove([callback])
// remove([callback]) - 删除数据
stuModel.findOne({ name: '楚子航' }).then(res => {
    res.remove()
})

4. 获取数据

  • get(path,[type]): 获取当前document对象属性
stuModel.findOne({ name: '楚子航' }).then(res => {
    console.log(res.get('name'))
})

MongoDB学习笔记三 - Mongoose API的使用_回调函数_13


5. 转换数据格式

  • toJSON(): 转换为一个JSON对象
// toJSON()
stuModel.findOne({ name: '楚子航' }).then(res => {
    console.log(res.toJSON());
})
  • toObject(): 将document对象转换为一个普通的JS对象
  • 转换为普通的js对象以后, 注意所有的Document对象的方法或属性都不能使用了
// toObject()
stuModel.findOne({ name: '楚子航' }).then(res => {
    console.log(res.toObject());
})