MongoDB学习之Mongoose的使用

数据治
• 阅读 1970

mongoose简介

mongoose网站:https://mongoosejs.com/

为什么要用Mongoose

Mongoose就是一个让我们可以通过Node来操作MongoDB的一个模块。
Mongoose本质是一个对象文档模型(ODM)库,
他对Node原生的MongoDB模块进行了一部优化封装,并且提供了更多的功能。

Mongoose的优势

  1. 可以像操作对象一样操作数据库
  2. 可以为文档创建一个模式结构(Schema)
  3. 可以对模型中的文档/文档进行验证
  4. 数据可以通过类型转换为对象模型
  5. 可以使用中间件来应用业务逻辑挂钩
  6. 比Node原生的MongoDB驱动更容易

使用Mongoose

  1. 下载安装mongoose模块

cnpm install mongoose --save

  1. 引用mongoose:

var mongoose =require("mongoose");

  1. 使用"mongoose"连接数据库:

var db =mongoose.connect("mongodb://user:pass@localhost:port/database");

  1. 执行下面代码检查默认数据库test,是否可以正常连接成功?
var mongoose =require("mongoose");
var db =mongoose.connect("mongodb://localhost/m_data");
db.connection.on("error",function (error) {
   console.log("数据库连接失败:" + error);
});
db.connection.on("open",function () {
   console.log("数据库连接成功!");
});
db.connection.once('close', ()=>{
    console.log('连接已经断开成功!')
})

mongoose基本使用

mongoose的几个新的对象

在MongoDB中,多个Document可以组成Collection(以下简称集合),多个集合又可以组成数据库。我们想要操作MongoDB数据,那就得先要具备上面所说的包含数据的“文档”,文档又是什么意思呢,请看如下介绍。

  1. 文档 —— 是MongoDB的核心概念,是键值对的一个有序集,在JavaScript里文档被表示成对象。同时它也是MongoDB中数据的基本单元,非常类似于关系型数据库管理系统中的行,但更具表现力。
  2. 集合 —— 由一组文档组成,如果将MongoDB中的一个文档比喻成关系型数据库中的一行,那么一个集合就相当于一张表。
  3. Schema—— 一种以文件形式存储的数据库模型骨架,无法直接通往数据库端,也就是说它不具备对数据库的操作能力,仅仅只是定义数据的类型,可以说是数据属性模型(传统意义的表结构),又或着是“集合”的模型骨架。

mongoose中任何任何事物都是从Schema开始的。每一个Schema对应MongoDB中的一个集合(collection)。Schema中定义了集合中文档(document)的样式。

定义一个Schema(表/ 模式对象)

//新建Schema 定义规则/字段的规则
let Schema= mongoose.Schema;
//定义personSchema的字段(规则)需要new一下 有点像构造函数的样子
let personSchema= new Schema({
    name: String,
    sex: String,
    age: Number
});

基本属性类型有

  • String
  • Number
  • Date
  • Boolean
  • Buffer
  • ObjectId
  • Mixed
  • Array

Model—— 由Schema构造生成的模型,根据Schema定义的数据类型规则,可操作具体的符合改规则的数据。

创建model(集合)

let personModel= mongoose.model('person', personSchema);

person:数据库中的集合名称,当我们对其添加数据时如果person已经存在,则会保存到其目录下,如果未存在,则会创建person集合,然后在保存数据。

//4. 插入文档
personModel.create({
    name: '张宁乐',
    sex: '男',
    age: 18
}, (err)=>{
   if(!err){
       console.log('插入成功!')
   }else{
       throw err;
   }
});

mongoose 插入和查询

mongoose查找数据的一些方法:
https://mongoosejs.com/docs/a...

插入多条数据

personModel.create([
    {name:'张逗逗',age: 2,sex: '男'},
    {name:'牛嘻嘻',age: 2,sex: '女'}
], (err)=>{
   if(!err){
       console.log('插入成功!')
   }else{
       throw err;
   }
})

查询

  • Model.find()
personModel.find({name: '张宁乐'}, (err, data)=>{
    if(!err){
        console.log(data)
    }else{
        throw err;
    }
})

查询所有

  • Model.find({}, callback)
personModel.find({}, (err, data)=>{
    if(!err){
        console.log(data)
    }else{
        throw err;
    }
})

也可以选择查找数据的条件(0隐藏 1显示 id默认显示) 和MongoDB在命令行中的使用方法一样

//查询时只显示name 
personModel.find({}, {name: 1, _id: 0}, (err,data)=>{
    if(!err){
        console.log(data)
    }else{
        throw err;
    }
})

find() skip(查询开始的位置)和limit(增加的条数)也可以使用

personModel.find({}, {name: 1, _id: 0, age: 1}, {skip: 0, limit: 2}, (err, data)=>{
    //只显示name 和 age   从第1开始 每次查询2条 
    if(!err){
        console.log(data)
    }else{
        throw err;
    }
})

MongoDB的find()、findOne() 等命令在 mongoose里都可以使用
具体可参考 :https://mongoosejs.com/docs/a...

mongoose 修改和删除

参考: https://mongoosejs.com/docs/a...

修改方法:

  • Model.update()
  • Model.updateMany()
  • Model.updateOne()
  • Model.watch()
personModel.update({name: '张宁乐'}, {$set: {age: 20}}, (err, data)=>{
   if(!err){
       console.log('修改成功!')
       console.log(data)
   }else{
       throw err;
   }
})

MongoDB学习之Mongoose的使用

删除方法

  • Model.remove()
  • Model.deleteMany()
  • Model.deleteOne()
personModel.remove({name:'牛嘻嘻'}, (err)=>{
    if(!err){
        console.log('删除成功!')
    }else{
        throw err;
    }
})

统计文档条数

  • Model.count()
personModel.count({}, (err,count)=>{
    if(!err){
        console.log('查询条数成功! 一共:' + count + '条');
    }else{
        throw err;
    }
})

MongoDB学习之Mongoose的使用

Entity

Entity—— 由Model创建的实体,使用save方法保存数据,Model和Entity的操作都能影响数据库的操作,但Model比Entity更具操作性。
使用Model创建Entity,如下示例:

let mongoose= require('mongoose');
let db= mongoose.connection('mongodb://localhost/m_data');
db.on('open', ()=>{
    console.log('连接成功!')
})
let Schema= mongoose.Schema;
let personSchema= new Schema({
    name: String,
    sex: String,
    age: Number
});
let personModel= mongoose.model('person', personSchema);
let personEntity = new personModel({
    name: '许巍',
    sex: '男',
    age: 38
})
personEntity.save((err, person)=>{
    if(!err){
        console.log('保存成功!')
        console.log(person);
    }else{
        console.log('保存失败!')
    }
})

MongoDB学习之Mongoose的使用

参考:https://blog.csdn.net/swimmin...

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
Java爬虫之JSoup使用教程
title:Java爬虫之JSoup使用教程date:201812248:00:000800update:201812248:00:000800author:mecover:https://imgblog.csdnimg.cn/20181224144920712(https://www.oschin
Stella981 Stella981
3年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Easter79 Easter79
3年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Stella981 Stella981
3年前
Mongoose
Mongoosemodifiedat是一款自动更新字段变化时间并记录到数据库中的Mongoose插件,类似Mongoose自带的timestamps功能。使用场景让我们考虑一个场景,我们有个文章发布与展示的需求,数据模型如下。constschemanewmongoose.Sche
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这