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. Nginx 的进程结构,你明白吗?

    Nginx 进程结构 这篇文章我们来看下 Nginx 的进程结构,Nginx 其实有两种进程结构: 单进程结构 多进程结构 单进程结构实际上不适用于生产环境,只适合我们做开发调试使用.因为在生产环境中 ...

  2. beacon帧字段结构最全总结(一)——beacon基本结构

    一.beacon帧主要结构 二.MAC  header 1.Version:版本号,目前为止802.11只有一个版本,所以协议编号为0 2.Type:定义802.11帧类型,802.11帧分为管理帧( ...

  3. canvas绘制工作流之绘制节点

    上一篇我们介绍了canvas绘制工作流的大概步骤,接下来会有系列文章细致的介绍怎么用canvas绘制工作流:这篇文章主要介绍用canvas绘制流程节点. 绘制前我们需要先准备一张节点图片,例如::好了 ...

  4. Java描述设计模式(19):模板方法模式

    本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景 通常一款互联网应用的开发流程如下:业务需求,规划产品,程序开发,测试交付.现在基于模板方法模式进行该过程描述. public c ...

  5. linux写系统服务的方法

    linux写系统服务的方法 2.1 首先编写demo程序:hello.c<pre>#include <stdio.h> # chkconfig: 2345 10 90 main ...

  6. 支付宝小程序和微信小程序的区别(部分)

    支付宝小程序和微信小程序之间的互相转换 1.首先是文件名 微信小程序 wxss ------ 支付宝小程序 acss 微信小程序 wxml ------ 支付宝小程序 axml 2.调用方法前缀 微信 ...

  7. IDEA快捷键汇总

    [常用] Ctrl+Shift + Enter,语句完成 "!",否定完成,输入表达式时按 "!"键 Ctrl+E,最近的文件 Ctrl+Shift+E,最近更 ...

  8. java编程思想第四版第十八章总结

    一.概述 如何学习java I/O 学习I/O类库 学习I/O发展史,为什么要学习发展史呢? 因为,如果缺乏发展史,我们就会对什么时候使用哪个类,以及什么时候不该使用它们而感到迷惑. 了解nio 二. ...

  9. nyoj 60-谁获得了最高奖学金 (逻辑判断)

    60-谁获得了最高奖学金 内存限制:64MB 时间限制:1000ms Special Judge: No accepted:8 submit:17 题目描述:     某校的惯例是在每学期的期末考试之 ...

  10. 领扣(LeetCode)N叉树的层序遍历 个人题解

    给定一个 N 叉树,返回其节点值的层序遍历. (即从左到右,逐层遍历). 例如,给定一个 3叉树 : 返回其层序遍历: [ [1], [3,2,4], [5,6] ] 说明: 树的深度不会超过 100 ...