MongoDB及Nodejs操作mongodb

MongoDB 的简介

MongoDB是一个基于分布式文件存储的数据库。由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。

MongoDB 术语/概念

SQL术语/概念 MongoDB术语/概念 解释说明
database database 数据库
table collection 数据库表/集合
row document 数据记录行/文档
column field 数据字段/域
index index 索引
table joins --- 表连接,MongoDB不支持
primary key primary key 主键,MongoDB自动将_id字段设置为主键

MongoDB - 数据库

  • 一个mongodb中可以建立多个数据库。
  • MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中。

MongoDB - 文档

  • 文档是一组键值对
  • MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大区别,也是 MongoDB 非常突出的特点。
//一个简单的文档例子
{"genres": ["犯罪", "剧情"], "title": "肖申克的救赎"}

MongoDB - 集合

  • 集合就是MongoDB的文档集合。类型于关系型数据库中的表格。
  • 集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。
//一个简单的集合例子
{"genres": ["犯罪", "剧情"], "title": "肖申克的救赎"}  //文档
{"genres": ["搞笑", "无聊"], "title": "李茶的姑妈"}
{"genres": ["好看"], "title": "无双", "stars": 9}

MongoDB 语句来操作数据库

show dbs  //显示数据库 (无内容数据库不显示)
db/db.getName() //查看当前所处数据库
use XXX  //创建/切换数据库

db.stats()  //显示当前db状态
db.dropDatabase() //删除当前数据库

  • insertOne
  • insertMany
- db.XXX.insertOne({}) //XXX表名 
- db.XXX.insertMany({name:'zhangshan',age:19},{name:'lisi',age:20})   //增加多条

  • deleteOne
  • deleteMany

  • updateOne
  • updateMany
- db.XXX.updateOne(查询条件,修改内容)
- db.XXX.updateMany(查询条件,修改内容)

db.hello.updateOne({name:'zhangshan'},{$set : {age:20}}) //修改一条
db.hello.updateMany({name:'zhangshan'},{$set : {age:20}}) //修改多条

db.XXX.find()  //查询所有记录 sql:select * from users

db.XXX.find(查询条件)
db.XXX.find({'age': 22}); //查询 age = 22 的记录  select * from users where age = 22;
db.XXX.find({age:{$gt:20}}) //查询年龄大于20的
db.XXX.find({age:{$lt:20}}) //查询年龄小于20的
db.XXX.find({age:{$gte:20}}) //查询年龄大于等于20的
db.XXX.find({age:{$1te:20}}) //查询年龄小于等于20的
db.XXX.find({'age': {$ne: 22}}); //查询 age != 22 的记录

db.XXX.find({'age': {$gte: 23, $lte: 26}}); //查询 age >= 23 并且 age <= 26
db.XXX.find({$or: [{age: {$gte: 23}}, {name: '张三'}]); //查询 age >= 23 或者 name == '张三'

db.XXX.find({'name': /mongo/}); //查询 name 中包含 mongo 的数据  select * from users where name like %mongo%;
db.XXX.find({'name': /^mongo/}); //查询 name 中已 mongo 开头的数据
db.XXX.find({'name': /mongo$/}); //查询 name 中已 mongo 结尾的数据

db.XXX.find({}, {name: 1, age: 1}); //查询 指定列 name 、age 的数据
db.XXX.find({age: {$gt: 25}}, {name: 1, age: 1}); //查询 指定列 name 、age 并且 age > 25

db.XXX.find().sort({age: 1}); //升序 倒序传-1

db.XXX.find({name:'zhangshan'},{age:20}) //查询 name = zhangsan , age = 20 的数据

db.XXX.find().limit(5); //查询 前5条数据
db.XXX.find().skip(10); //查询 10条以后的数据
db.XXX.find().limit(10).skip(5); //查询 在 5 - 10 之间的数据
db.XXX.find().count(); //查询 某个结果集的记录条数

db.XXX.findOne(); //查询第一条数据

使用 skip() 与 limit() 实现分页

  1. pageNum 当前第几页
  2. pageSize 每页显示多少条
  3. totalPage 一共有几页 Math.ceil (totalSize/pageSize)
  4. totalSize 一共有多少条数据 db.XXX.find().count()
第一页: db.XXX.find().skip((pageNum - 1) * pageSize).limit(pageSize)
第二页: db.XXX.find().skip(10).limit(10)
第三页: db.XXX.find().skip(20).limit(10)
第四页: db.XXX.find().skip(30).limit(10)

Mongoose

是一款能够在 nodejs 中操作 MongoDB 数据库的模块

两个核心概念点

  • schema
    表示数据库表结构的一种格式
{
    key : value
    key -> 表中字段的名字
    value -> string | object
    
    name : string
    age :number
    password: {
        type :string,   //传递的数据类型
        required :true,  //表示这个字段必须要传递
        default : '123'  //默认值
    }
}
  • model
    基于某个 schema 生成的某个表的模型对象,生成的模型对象上就有一系列的对数据库这张表操作的方法

使用步骤

创建文件 npm init -y(初始化) -> npm install --save express(安装依赖)

  1. 安装 mongoose npm install --save mongoose
  2. 建立 MongoDB 链接对象
  3. 创建某张表的 schema 与相对应的 model
  4. 基于第3步中的 model 来对这张表进行操作(server.js)
  • 2.建立 MongoDB 链接对象 :在项目目录下创建文件夹(进行配置 config) ->创建js文件(作用:暴露数据链接了MongoDB的mongoose对象)
//1.引入 mongoose
const mongoose = require("mongoose");

//2.定义数据库的链接地址  37代表数据库的名字
const url = 'mongodb://127.0.0.1:27017/37';  //这里是mongodb协议 MongoDB的端口号为27017

//3.mongoose.connect 方法来链接 返回的是promise对象
mongoose
  .connect(url, { useNewUrlParser: true })  //connect参数2是个对象 为可选参数 当出现useNewUrlParser警告时 再来设置
  .then(() => {
    console.log("数据库链接成功");
  })
  .catch(err => {
    console.log("数据库链接失败", err.message);
  });

// 4. 暴露已经链接了数据库的 mongoose 对象
module.exports = mongoose;
  • 3.创建某张表的 schema 与相对应的 model : 在项目目录下创建文件夹 (用于生成模型对象的 models) -> 创建js文件(作用:生成XXX表的模型对象)
1. 引入链接了数据库的 mongoose 对象 (链接前面暴露出来的js文件)
const db = require('../XXjs');

2. 定义这张表(集合)的 schema 对象
const schema = new db.Schema({   //db中有一个Schema的构造函数 设置需要的字段格式
  // key: value 的设置
  name: {
    type: String, //类型首字母大写
    required: true  //定义必须存在
  },

  age: {
    type: Number,
    default: 18  //默认为18
  },

  sex: {
    type: Number,
    default: 1
  }
});

3. 基于第2步中的 schema 生成 model 对象并暴露model   db.model()方法
module.exports = db.model('student',schema); //数据库的表名是根据 db.model 第一个参数的复数形式来确定的
  1. 基于第3步中的 model 来对这张表进行操作(server.js)
//点出重点和一些使用方法

//引入3中生成的model对象
const StudentModel = require('./models/student');

//req.query 获取get请求传递过来的参数
//req.body 获取post请求传递过来的参数

//增 
//生成模型的实例对象如student 
//将实例对象(其中的数据从前端获得)写入数据库
student.save() //save() 往数据库插入数据时,会更新重复的数据

//查(这里是获取所有数据给前端)
StudentModel.find()  可获取所有的数据

//改
StudentModel.updateOne() //(只修改一个){要修改的条件(数据库中修改参数的名字),要修改的内容}

//删
 StudentModel.deleteOne()  //只删除一个
 
//分页
//pageNum 当前第几页
//pageSize 每页显示多少条
//totalPage 一共有几页       Math.ceil (totalSize/pageSize) 
//totalSize 一共有多少条数据    db.XXX.find().count(

Robo 3T 1.3 :图像化界面

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容