依赖包安装

使用Node.js操作MongoDB数据库需要依赖Node.js第三方包mongoose

使用npm install mongoose命令下载

npm install mongoose

启动MongoDB

我们安装MongoDB时都是将其作为了Windown下的一个服务,只有服务启动了,我们才能连接它

一般默认情况下是已启动的,但有时关闭了需要我们重新启动

停止服务

net stop mongodb

启动服务

net start mongodb

数据库连接

使用mongoose提供的connect方法即可连接数据库,本地端口号默认为27017,如果当前数据库不存在则在插入文档时会自动创建

mongoose.connect('mongodb://localhost/demo')
.then(()=>{console.log('mongodb connected')})
.catch((err)=>{console.log(err)})

创建集合

创建集合分为两步,一是对集合设定规则,二是创建集合,创建mongoose.Schema构造函数的实例即可创建集合。

// 设定集合规则const UserSchema = new mongoose.Schema({name: String,email: String,password: String});
// 创建集合并应用规则const User = mongoose.model('User', UserSchema); //返回的是一个集合的构造函数

mongoose验证

在创建集合规则时,可以设置当前字段的验证规则,验证失败就则输入插入失败

required: true 必传字段   不写默认false 非必传

minlength:5 字符串最小长度

maxlength: 20 字符串最大长度

const UserSchema = new mongoose.Schema({name: {type: String,required: [true,'需要传入字段'],//可以是数组的形式,第二个参数就是错误信息minlength: [2,'字符串需大于2'],maxlength: [10,'字符串需小于10'],}
})

min: 2 数值最小为2

max: 100 数值最大为100

const UserSchema = new mongoose.Schema({age: {type: Number,required: true,min: [2,'需要大于2'],max: 10}
})

enum: ['html', 'css', 'javascript', 'node.js']  枚举 传入字段的值必须是这几个

const UserSchema = new mongoose.Schema({course: {type: String,required: true,enum: {             //可以是对象形式来自定义错误信息values: ['html', 'css', 'javascript', 'node.js'],message: '不对' //自定义错误信息}}
})

trim: true 去除字符串两边的空格

validate: 自定义验证器

const UserSchema = new mongoose.Schema({string: {type: String,validate: {validator: v => {  //返回一个布尔值return v && v.length>3},message: '不合规则'}}
})

default: 默认值

const UserSchema = new mongoose.Schema({date: {type: Date,default: Date.now}
})

怎么直接拿到错误信息

.catch(err=>{ for(var k in err.errors){console.log(err.errors[k].message)
} })

创建文档

创建文档实际上就是向集合中插入数据

第一种方法

首先创建集合实例

再调用实例对象下的save方法将数据保存到数据库中

//实例集合对象
const newUser = new User({name: 'mrz',email: 'email@155.com',password: '123456'})
//调用save
newUser.save()
.then(user=>console.log(user))
.catch(err=>console.log(err))

第二种方法

调用集合构造函数下的create方法

User.create({name: 'mrz',email: 'email@155.com',password: '123456'})
.then(user => console.log((user))
.catch(err => console.log(err))

也可以是回调函数的形式

User.create({name: 'mrz', email: 'email@155.com',password: '123456'}, (err, user) => { //  错误对象console.log(err)//  当前插入的文档console.log(user)
});

mongoDB数据库导入数据

mongoimport –d 数据库名称 –c 集合名称 –file 要导入的数据文件

找到mongodb数据库的安装目录,将安装目录下的bin目录放置在环境变量中

查询文档

find查找

条件为空

//  根据条件查找文档(条件为空则查找所有文档)
User.find().then(result => console.log(result))

这里我已经插入了三条数据,返回结果为

[
  {
    _id: new ObjectId("618feb7a6eed97fb62aeb6bd"),
    name: 'mrz',
    email: 'email@155.com',
    password: '123456',
    __v: 0
  },
  {
    _id: new ObjectId("618fec049173df142ac75ccd"),
    name: 'mewu',
    email: 'email@163.com',
    password: '456789',
    __v: 0
  },
  {
    _id: new ObjectId("618fecc2147f6fd2bb0114ff"),
    name: 'xiaoz',
    email: '77@qq.com',
    password: '78988878',
    __v: 0
  }
]

有条件的查找

User.find({name: 'mewu'}).then(result=>console.log(result))

返回结果

[
  {
    _id: new ObjectId("618fec049173df142ac75ccd"),
    name: 'mewu',
    email: 'email@163.com',
    password: '456789',
    __v: 0
  }
]

如果该条件查找不到

User.find({name: 'aa'}).then(result=>console.log(result))

返回结果为空数组

[]

结论:find查找返回的都是一个数组

findOne查找

条件为空默认返回第一条数据

User.findOne().then(result=>console.log(result))

返回结果是一个对象

{
  _id: new ObjectId("618feb7a6eed97fb62aeb6bd"),
  name: 'mrz',
  email: 'email@155.com',
  password: '123456',
  __v: 0
}

添加条件

User.findOne({name: 'xiaoz'}).then((result)=>{console.log(result)})

返回结果

{
  _id: new ObjectId("618fecc2147f6fd2bb0114ff"),
  name: 'xiaoz',
  email: '77@qq.com',
  password: '78988878',
  __v: 0
}

表达式查询文档

//  匹配大于 小于
User.find({age: {$gt: 20, $lt: 50}}).then(result => console.log(result))
 //  匹配包含User.find({hobbies: {$in: ['神魔念']}}).then(result => console.log(result))
//  选择要查询的字段
User.find().select('name email').then(result => console.log(result))
// 将数据按照年龄进行排序
User.find().sort('age').then(result => console.log(result))

逆序就添一个负号 -

//  skip 跳过多少条数据  limit 限制查询数量
User.find().skip(2).limit(2).then(result => console.log(result))

删除文档

删一个 没条件删第一个

// 删除单个
User.findOneAndDelete({}).then(result => console.log(result))

返回结果是我们删除的那条数据

{
  _id: new ObjectId("618feb7a6eed97fb62aeb6bd"),
  name: 'mrz',
  email: 'email@155.com',
  password: '123456',
  __v: 0
}

删多个 没条件全删

// 删除多个
User.deleteMany({}).then(result => console.log(result))

返回结果为删除数量

{ deletedCount: 2 }

更新文档

// 更新单个
User.updateOne({name: 'daz'},{name: 'xiaoz'}).then(result=>console.log(result))

返回结果

{
  acknowledged: true,
  modifiedCount: 1,   //修改数量
  upsertedId: null,
  upsertedCount: 0,
  matchedCount: 1
}

// 更新多个 没条件全改
User.updateMany({}, {name: xxx}).then(result => console.log(result))

集合关联

关键字 populate

我们需要至少两个集合

使用ID来将Job 与User进行关联

Job集合规则

type为  mongoose.Schema.Types.ObjectId

ref 为你要关联的集合

将User某一数据ID传入person字段

const JobSchema = new mongoose.Schema({title: String,person: {type: mongoose.Schema.Types.ObjectId,ref: 'User'}
})const Job = mongoose.model('Job',JobSchema)Job.create({title: '123',person: '618ffc49dc7ec67254b1e8ac'})
.then(result=>console.log(result))

返回结果

{
  title: '123',
  person: new ObjectId("618ffc49dc7ec67254b1e8ac"),
  _id: new ObjectId("618ffebd455c90187550eaf2"),
  __v: 0
}

查找一下

Job.find().then(result=>console.log(result))

返回结果

[
  {
    _id: new ObjectId("618ffebd455c90187550eaf2"),
    title: '123',
    person: new ObjectId("618ffc49dc7ec67254b1e8ac"),
    __v: 0
  }
]

链式调用populate 传入要查询字段

Job.find().populate('person').then(result=>console.log(result))

返回结果

[
  {
    _id: new ObjectId("618ffebd455c90187550eaf2"),
    title: '123',
    person: {
      _id: new ObjectId("618ffc49dc7ec67254b1e8ac"),
      name: 'nizaigansm',
      age: 20,
      __v: 0
    },
    __v: 0
  }
]

Mongoose第三方包常用操作整理相关推荐

  1. 【Android 插件化】Hook 插件化框架 ( 反射工具类 | 反射常用操作整理 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  2. Linux常用操作整理

    用户权限的命令参考:Linux用户权限 比较重要的知识点 能简单使用 cat,grep,cut 等命令进行一些操作: 文件系统相关的原理,inode 和 block 等概念,数据恢复: 硬链接与软链接 ...

  3. Mysql数据库常用操作整理

    0.说明 MySQL数据库是一个十分轻便的数据库管理系统,相比大型的数据库管理系统如Oracle,MySQL更拥有轻便.灵活.开发速度快的特色,更适用于中小型数据的存储与架构,被数以万计的网站采用.从 ...

  4. QuartusII常用操作整理

    文章目录 查看RTL视图 更改Quartes默认编辑器 添加仿真配置 查看RTL视图 在综合完成后可以在Quartus中查看综合成的RTL视图 更改Quartes默认编辑器 个人感觉Quartus自带 ...

  5. 【neo4j】Neo4j-Cypher、py2neo常用操作整理

    目录 Cypher 1.创建 2.查询 3.修改 4.排序 ORDER BY 5.导入csv文件(load csv) 6.索引 py2neo 1.连接数据库 2.创建节点 3.创建关系 4.查询节点 ...

  6. git与github常用操作整理

    概要 Git是一种专为处理文本文件而设计的版本控制系统. 允许你通过提交对一个系统(或一组)文件的历史进行注释.这些提交便是在给定时间点对系统做出的差异"快照". 单机上的文件版本 ...

  7. R 语言怎么保存工作目录到当前路径_【R语言基础】01.R语言软件环境搭建及常用操作...

    一.R语言简介 R语言是专业的统计分析软件,来自著名数据科学网站(http://www.kdnuggets.com/)发起的一个2019年统计分析和数据挖掘软件使用情况的调查结果: 表明R语言是该领域 ...

  8. php字符串相关操作,PHP字符串常用操作

    常用操作有: PHP中有两个内建的函数:count() 和sizeof(),可以实现得到数组的长度 count($sttr);数组长度 字符串长度:strlen(string $a); 判断是否相同, ...

  9. Go 字符串及strings包常见操作

    1.字符串的定义 字符串是不可变值类型,内部用指针指向 UTF-8 字节数组. Go 语言中可以使用反引号或者双引号来定义字符串.反引号表示原生的字符串,即不进行转义.Go 语言的字符串不支持单引号 ...

最新文章

  1. Android 常见异常及解决办法
  2. BZOJ 2257: [Jsoi2009]瓶子和燃料
  3. 软件性能测试类型和指标
  4. Windows Phone开发(20):当MediaElement和VideoBrush合作的时候
  5. 用C/C++扩展你的PHP
  6. java程序中可以有几个构造方法_java中多个构造方法可以相互引用么?
  7. CORD 4.1:打造实现边缘计算的最佳平台
  8. SAP Spartacus B2B Unit page Expand all按钮的工作原理
  9. php如何解码图片,php基于base64解码图片与加密图片还原实例_PHP
  10. python的变量在使用前不需要先赋值_在赋值Python之前引用的另一个局部变量
  11. sqlitestudio和mysql_SQLiteStudio优雅调试Android手机数据库Sqlite(推荐)
  12. Package.json 属性说明
  13. 关系抽取---(二)卷积神经网络
  14. 利用opencv生成面膜
  15. apicloud 微信授权在AppLoader中 包名不一致
  16. Windows自带工具提取颜色得到十六进制颜色码
  17. c语言win32api勾取,第一次用C语言+win32api写窗体应用程序,晕死了
  18. 3年级计算机的知识能力,三年级信息技术教案资料三篇
  19. 电脑启用网络发现以后在点开又成关闭状态了,导致网上邻居访问不了 。如何处理
  20. JAVA_Android开发官网

热门文章

  1. Conda环境无法激活
  2. entity framework core mysql,DotNet Core下使用 EntityFrameworkCore 操作MySQL (一)
  3. 基于机器学习的天气数据分析与预测系统
  4. C#爬虫 音娱吉他文本和弦谱
  5. unixODBC中 column .... does not exist 的解决过程
  6. msray网址采集软件即将上线国外搜素引擎-QWANT
  7. IIS配置webp后缀文件
  8. 当我们在谈SWIFT时,到底在谈什么?
  9. 全景图矫正 matlab,全景图的后期水平矫正的三种方法
  10. C++封装dll供C#调用获取U盘/磁盘序列号信息