Mongoose第三方包常用操作整理
依赖包安装
使用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第三方包常用操作整理相关推荐
- 【Android 插件化】Hook 插件化框架 ( 反射工具类 | 反射常用操作整理 )
Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...
- Linux常用操作整理
用户权限的命令参考:Linux用户权限 比较重要的知识点 能简单使用 cat,grep,cut 等命令进行一些操作: 文件系统相关的原理,inode 和 block 等概念,数据恢复: 硬链接与软链接 ...
- Mysql数据库常用操作整理
0.说明 MySQL数据库是一个十分轻便的数据库管理系统,相比大型的数据库管理系统如Oracle,MySQL更拥有轻便.灵活.开发速度快的特色,更适用于中小型数据的存储与架构,被数以万计的网站采用.从 ...
- QuartusII常用操作整理
文章目录 查看RTL视图 更改Quartes默认编辑器 添加仿真配置 查看RTL视图 在综合完成后可以在Quartus中查看综合成的RTL视图 更改Quartes默认编辑器 个人感觉Quartus自带 ...
- 【neo4j】Neo4j-Cypher、py2neo常用操作整理
目录 Cypher 1.创建 2.查询 3.修改 4.排序 ORDER BY 5.导入csv文件(load csv) 6.索引 py2neo 1.连接数据库 2.创建节点 3.创建关系 4.查询节点 ...
- git与github常用操作整理
概要 Git是一种专为处理文本文件而设计的版本控制系统. 允许你通过提交对一个系统(或一组)文件的历史进行注释.这些提交便是在给定时间点对系统做出的差异"快照". 单机上的文件版本 ...
- R 语言怎么保存工作目录到当前路径_【R语言基础】01.R语言软件环境搭建及常用操作...
一.R语言简介 R语言是专业的统计分析软件,来自著名数据科学网站(http://www.kdnuggets.com/)发起的一个2019年统计分析和数据挖掘软件使用情况的调查结果: 表明R语言是该领域 ...
- php字符串相关操作,PHP字符串常用操作
常用操作有: PHP中有两个内建的函数:count() 和sizeof(),可以实现得到数组的长度 count($sttr);数组长度 字符串长度:strlen(string $a); 判断是否相同, ...
- Go 字符串及strings包常见操作
1.字符串的定义 字符串是不可变值类型,内部用指针指向 UTF-8 字节数组. Go 语言中可以使用反引号或者双引号来定义字符串.反引号表示原生的字符串,即不进行转义.Go 语言的字符串不支持单引号 ...
最新文章
- Android 常见异常及解决办法
- BZOJ 2257: [Jsoi2009]瓶子和燃料
- 软件性能测试类型和指标
- Windows Phone开发(20):当MediaElement和VideoBrush合作的时候
- 用C/C++扩展你的PHP
- java程序中可以有几个构造方法_java中多个构造方法可以相互引用么?
- CORD 4.1:打造实现边缘计算的最佳平台
- SAP Spartacus B2B Unit page Expand all按钮的工作原理
- php如何解码图片,php基于base64解码图片与加密图片还原实例_PHP
- python的变量在使用前不需要先赋值_在赋值Python之前引用的另一个局部变量
- sqlitestudio和mysql_SQLiteStudio优雅调试Android手机数据库Sqlite(推荐)
- Package.json 属性说明
- 关系抽取---(二)卷积神经网络
- 利用opencv生成面膜
- apicloud 微信授权在AppLoader中 包名不一致
- Windows自带工具提取颜色得到十六进制颜色码
- c语言win32api勾取,第一次用C语言+win32api写窗体应用程序,晕死了
- 3年级计算机的知识能力,三年级信息技术教案资料三篇
- 电脑启用网络发现以后在点开又成关闭状态了,导致网上邻居访问不了 。如何处理
- JAVA_Android开发官网
热门文章
- Conda环境无法激活
- entity framework core mysql,DotNet Core下使用 EntityFrameworkCore 操作MySQL (一)
- 基于机器学习的天气数据分析与预测系统
- C#爬虫 音娱吉他文本和弦谱
- unixODBC中 column .... does not exist 的解决过程
- msray网址采集软件即将上线国外搜素引擎-QWANT
- IIS配置webp后缀文件
- 当我们在谈SWIFT时,到底在谈什么?
- 全景图矫正 matlab,全景图的后期水平矫正的三种方法
- C++封装dll供C#调用获取U盘/磁盘序列号信息