mongodb以及mongoose的使用

课程介绍看这里:https://www.cnblogs.com/zhangran/p/11963616.html

项目github地址:https://github.com/hellozhangran/happy-egg-server

mongodb

mongodb是典型的非关系型数据库,关于它的背景介绍和优势劣势这里就不赘述,我们直接讲实操或者说最有可能用到的部分。

mongodb常用指令

  • mongod --config /opt/mongodb/mongod.conf 启动mongod服务。

    • 如果想在后台启动,需要修改mongod.conf,添加fork=true,然后再启动。
    • 想关掉后台运行的mongod服务,先查看所有后台运行的服务 lsof -i,找到mongod的pid号,kill yourpid
  • mongo 进入 mongo 环境
  • show dbs 查看所有的数据库
  • use test 进入test数据库
  • db.createCollection('user') 创建一个user集合
    • 这里简单介绍一下集合的概念,mongo 是非关系型数据库,不存在表的概念,与表相对应的是集合。当然集合不是表,与表相差很大,没有表的行列结构,可以简单的把集合当成一个 list,而 list 里面会放一个个对象。有没有发现这像极了json数据格式。
  • db.user.insert({name: 'zhangsan', age: 21, sex: 'male'}) 在集合中插入一条数据
  • db.user.find() 查看集合user中的所有数据
  • db.user.find().pretty() 以一个漂亮点的格式显示数据
  • db.user.find({name: 'zhangsan'}) find的第一个参数是where选择条件,显示符合name='zhangsan'的整条数据
  • db.user.find({name: 'zhangsan'}, {name: 1}) find的第一个参数是指定显示内容,显示符合条件的name,1是显示,0是不显示。

使用mongoose

mongoose是一个nodejs工具库,方便使用nodejs操作mongodb

1. 首先使用mongoose连接mongodb数据库

const mongoose = require('mongoose');

// 创建一个连接,并监听各种事件,在执行connect操作时,各事件会视具体情况而触发。
mongoose.connection
.on('error', function (err) {
// 数据库连接失败时触发
console.log('connect error: ', err);
})
.on('disconnected', function () {
// 数据库断开时触发,断开重连的逻辑可以放在这里。
})
.once('open', function () {
// 数据库连接成功时触发,express开启listen的逻辑可以放在这里。
}); // 启动mongod服务默认是运行在127.0.0.1上,所以下面路径是localhost
// test是数据库名,如果有则连接,如果无则创建
mongoose.connect('mongodb://localhost/test', {
useNewUrlParser: true,
useUnifiedTopology: true
});

2. Schema与Model

在mongoose中Schema、Model是非常重要的概念。Model对应mongodb中的集合 collection,而Schema对应集合的结构,也就是结合都有哪些字段、字段的类型、是否必填、是否有缺省值等。

const UserSchema = mongoose.Schema({
name: String,
age: Number,
sex: Boolean
}); // Schema的静态方法
UserSchema.statics.findUserByAge = function (age) {
// 用then来拿到结果,如findUserByAge(21).then((res) => {})。
// 也可以在find第二个参数传回调函数
return this.find({'age': age});
} // Schema的实例方法
UserSchema.methods.findUserByName = function(name) {
return this.model('User').find({ name: name });
}; // 创建一个Model,第三参数指定mongodb中collection的名字,如果不传则默认为变为复数(即Users)
const User = mongoose.model('User', UserSchema, 'user'); // 创建一条数据
// 1. 直接用User创建
User.create({name: 'zhangsan', age: 27, sex: true}, function(err, info) {
console.log(info);
}); // 2. 新创建一个对象再添加数据到数据库
// 再次说明下现在mongoose默认是支持promise方式的,可以使用then 或 回调函数的方式
var person = new User({name: 'lisi', age: 20, sex: false});
person.save().then(res => {
console.log(res);
}) // 调用Schema中定义的静态方法,可以通过User直接调
User.findUserByAge(21); // 调用Schema中定义的实例方法方法,先实例化再调
const user = new User();
user.findUserByName('zhangsan'); // 删除数据,删除符合条件的一条
User.deleteOne({name: 'lisi'}).then(); // 删除符合条件的所有数据
User.deleteMany({age: 20}).then(); // 注意:remove()方法已经被弃用了!

最后附上mongoose的api文档,其他的使用方法不一一列举:

http://www.mongoosejs.net/docs/api.html

TODO

上面讲的是目前项目中已经用到的,后续可能会继续拓展的:

  • docker与mongodb
  • mongodb复制集之自动容灾

【重学Node.js 第3篇】mongodb以及mongoose的使用的更多相关文章

  1. 【重学Node.js 第4篇】实现一个简易爬虫&启动定时任务

    实现一个简易爬虫&启动定时任务 课程介绍看这里:https://www.cnblogs.com/zhangran/p/11963616.html 项目github地址:https://gith ...

  2. 【重学Node.js 第5篇】部署项目到腾讯云服务器

    课程介绍看这里:https://www.cnblogs.com/zhangran/p/11963616.html 项目github地址:https://github.com/hellozhangran ...

  3. 打算写一个《重学Node.js》系列,希望大家多多支持

    先放上链接吧,项目已经开始2周了:https://github.com/hellozhangran/happy-egg-server 想法 现在是2019年11月24日,还有人要开始学习Node.js ...

  4. nodejs实战《一起学 Node.js》 使用 Express + MongoDB 搭建多人博客

    GitHub: https://github.com/nswbmw/N-blog N-blog 使用 Express + MongoDB 搭建多人博客 开发环境 Node.js: 6.9.1 Mong ...

  5. 【重学Node.js 第1&2篇】本地搭建Node环境并起RESTful Api服务

    本地搭建Node环境并起RESTful Api服务 课程介绍看这里:https://www.cnblogs.com/zhangran/p/11963616.html 项目github地址:https: ...

  6. node.js操作数据库之MongoDB+mongoose篇

    前言 node.js的出现,使得用前端语法(javascript)开发后台服务成为可能,越来越多的前端因此因此接触后端,甚至转向全栈发展.后端开发少不了数据库的操作.MongoDB是一个基于分布式文件 ...

  7. Node.js、express、mongodb 实现分页查询、条件搜索

    前言 在上一篇Node.js.express.mongodb 入门(基于easyui datagrid增删改查) 的基础上实现了分页查询.带条件搜索. 实现效果 1.列表第一页. 2.列表第二页 3. ...

  8. Node.js Stream-基础篇

    Node.js Stream - 基础篇 邹斌 ·2016-07-08 11:51 背景 在构建较复杂的系统时,通常将其拆解为功能独立的若干部分.这些部分的接口遵循一定的规范,通过某种方式相连,以共同 ...

  9. Node.js、express、mongodb 入门(基于easyui datagrid增删改查)

    前言 从在本机(win8.1)环境安装相关环境到做完这个demo大概不到两周时间,刚开始只是在本机安装环境并没有敲个Demo,从周末开始断断续续的想写一个,按照惯性思维就写一个增删改查吧,一方面是体验 ...

随机推荐

  1. .Net Core Vue Qucik Start

    .Net Core Vue Qucik Start This is a ASP.NET Core 3.0 project seamlessly integrationed with Vue.js te ...

  2. Jenkins+JMeter+Ant 接口持续集成

    ​JMeter安装 JMeter安装包: 下载地址:https://jmeter.apache.org/download_jmeter.cgi 依赖JDK环境 JDK环境配置: JAVA_HOME   ...

  3. Mybatis自定义TypeHandler解决特殊类型转换问题

    我们知道,Java和MySQL中的数据类型是不同的,Java中除了基本数据类型,还有对象. 有时候使用MySQL存储数据,或者从MySQL中读取数据时,会有一些特殊需求

  4. 【原创】使用批处理脚本自动生成并上传NuGet包

    Hello 大家好,我是TANZAME,我们又见面了. NuGet 是什么这里就不再重复啰嗦,园子里一搜一大把.今天要跟大家分享的是,在日常开发过程中如何统一管理我们的包,如何通过批处理脚本生成包并自 ...

  5. T-SQL Part X: UNION, EXCEPT and INTERSECT

    MSDN上关于EXCEPT和INTERSECT的文档.MSDN上关于UNION的文档. 值得注意的是,UNION其实有两种,一种是普通的UNION,另外一种是UNION ALL.加上EXCEPT和IN ...

  6. C++中对封装的语法支持——友元

    友元 1.友元就是授权给某个函数.每个成员函数.某个类具有访问类内部私有成员的权限. 2.为什么用友元?友元可以允许某个类.函数直接访问类内部私有数据,减少函数调用开销,提高效率. 3.友元函数不是成 ...

  7. nyoj 48-小明的调查作业(set)

    48-小明的调查作业 内存限制:64MB 时间限制:1000ms Special Judge: No accepted:15 submit:29 题目描述: 小明的老师布置了一份调查作业,小明想在学校 ...

  8. suseoj 1211: 子集和问题 (dfs)

    1211: 子集和问题 时间限制: 1 Sec  内存限制: 128 MB提交: 2  解决: 2[提交][状态][讨论版][命题人:liyuansong] 题目描述 子集和问题的一个实例为<S ...

  9. nyoj 244-16进制的简单运算 (scanf("%x%c%x", &a, &b, &c); printf("%o", a ± b))

    244-16进制的简单运算 内存限制:64MB 时间限制:1000ms 特判: No 通过数:12 提交数:13 难度:1 题目描述: 现在给你一个16进制的加减法的表达式,要求用8进制输出表达式的结 ...

  10. SQLite性能 - 意想不到,但又情理之中的测试结果。

    win7(64) sata2 希捷 MINGW32_NT-(/) cat: /proc/cpuinfo: No such file or directory ------ in disk ---- r ...