在上一篇我们讲了如何通过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)
}
})

运行结果:

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


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


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

参数解析:

  • 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)
}
})


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);
});




4. 删除文档

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

补充

  • Model.count(conditions , callback )

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

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('保存成功');
}
})




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));
})

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'))
})


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());
})

MongoDB学习笔记三 - MongooseAPI操作数据的更多相关文章

  1. MongoDB学习笔记三—增删改文档上

    插入insert 单条插入 > db.foo.insert({"bar":"baz"}) WriteResult({ }) 批量插入 > db.fo ...

  2. Mongodb学习笔记三(Mongodb索引操作及性能测试)

    第三章 索引操作及性能测试 索引在大数据下的重要性就不多说了 下面测试中用到了mongodb的一个客户端工具Robomongo,大家可以在网上选择下载.官网下载地址:http://www.robomo ...

  3. MongoDB学习笔记三:查询

    MongoDB中使用find来进行查询.查询就是返回一个集合中文档的子集,子集合的范围从0个文档到整个集合.find的第一个参数决定了要返回哪些文档,其形式也是一个文档,说明要执行的查询细节.空的查询 ...

  4. MongoDB学习笔记(三) 在MVC模式下通过Jqgrid表格操作MongoDB数据

    看到下图,是通过Jqgrid实现表格数据的基本增删查改的操作.表格数据增删改是一般企业应用系统开发的常见功能,不过不同的是这个表格数据来源是非关系型的数据库MongoDB.nosql虽然概念新颖,但是 ...

  5. Mongodb 学习笔记(三) .net core SDK

    首先添加 Nuget包  MongoDB.Driver 创建一个Model. public class Student { public ObjectId _id { get; set; } publ ...

  6. MongoDB学习笔记(转)

    MongoDB学习笔记(一) MongoDB介绍及安装MongoDB学习笔记(二) 通过samus驱动实现基本数据操作MongoDB学习笔记(三) 在MVC模式下通过Jqgrid表格操作MongoDB ...

  7. MongoDB学习笔记(三)--权限 && 导出导入备份恢复 && fsync和锁

    权限                                                                                             绑定内网I ...

  8. MongoDB 学习笔记(原创)

    MongoDB 学习笔记 mongodb 数据库 nosql 一.数据库的基本概念及操作 SQL术语/概念 MongoDB术语/概念 解释/说明 database database 数据库 table ...

  9. mongoDB 学习笔记纯干货(mongoose、增删改查、聚合、索引、连接、备份与恢复、监控等等)

    最后更新时间:2017-07-13 11:10:49 原始文章链接:http://www.lovebxm.com/2017/07/13/mongodb_primer/ MongoDB - 简介 官网: ...

随机推荐

  1. PAT乙级:1064 朋友数 (20分)

    PAT乙级:1064 朋友数 (20分) 题干 如果两个整数各位数字的和是一样的,则被称为是"朋友数",而那个公共的和就是它们的"朋友证号".例如 123 和 ...

  2. 【Uva1025 A Spy in the Metro】动态规划

    题目描述 某城市地铁是线性的,有n(2≤n≤50)个车站,从左到右编号1~n.有M1辆列车从第1站开始往右开,还有M2辆列车从第n站开始往左开.列车在相邻站台间所需的运行时间是固定的,因为所有列车的运 ...

  3. Mac终端美化(iterm2+zsh+oh-my-zsh+powerlevel10k)

    iterm2+zsh+oh-my-zsh+powerlevel10k 一.下载iterm2 方式一:官网下载 https://iterm2.com/ 方式二:百度云下载 链接: https://pan ...

  4. 第四篇 -- Go语言string转其他类型

    1. string转int // 法1:string转int num_str := "1234567" /* ParseInt():查看文档https://studygolang. ...

  5. ts 学习笔记 - 类

    目录 类 类的概念 类的用法 属性和方法 类的继承 存取器 静态属性 Typescript 中的用法 抽象类 类的类型 类与接口 类实现接口 接口继承接口 接口继承类 混合类型 类 类的概念 类 (c ...

  6. ubuntu16登录后黑屏无法进入系统问题汇总

    今晚在使用虚拟机的过程中发现有些卡顿,顿时想给虚拟机增加内核数,然后,然后,,,我就再也没有看到过图形化界面,在某搜索引擎查找了半天,把我的问题汇总了一下发出来,希望对遇到同样问题的有所帮助. 出现黑 ...

  7. Spring Cloud分区发布实践(5)--定制ServiceInstanceListSupplier

    现在我们简单地来定制二个 ServiceInstanceListSupplier, 都是zone-preference的变种. 为了方便, 我重新调整了一下项目的结构, 把一些公用的类移动到hello ...

  8. 为什么 WordPress 镜像用起来顺手?

    有用户朋友问,用已有WordPress镜像好?还是自己动手安装配置好? 答案:用Websoft9的相关镜像好(各大云市场的镜像提供商比较多,"真假李逵"的现象总是有的,我们只对We ...

  9. URI 未注册(设置 | 语言和框架 | 架构和 DTD)

    创建xml文件导入资源出错 解决方法:点击左边的小红灯,选择获取外部资源,加载资源即可

  10. 剑指 Offer 32 - II. 从上到下打印二叉树 II

    剑指 Offer 32 - II. 从上到下打印二叉树 II 从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行. 例如: 给定二叉树: [3,9,20,null,null,1 ...