Mongodb
- Mongodb介绍
- Mongodb核心概念
- 数据库
- 集合
- 文档
- 安装Mongodb
- 运行地址
- 步骤1
- 步骤2(新起一个cmd)
- 命令行交互
- 数据库命令
- 集合命令
- 文档命令
- Mongoose
- 设置运行命令
- 字段类型
- 字段值验证
- Mongoose新增文档
- Mongoose删除文档
- Mongoose更新文档
- Mongoose读取文档
- 条件控制
- 个性化读取
- 字段筛选
- 数据排序
- 数据截取
Mongodb介绍
- Mongodb是基于分布式文件存储的数据库
- 数据库是按照数据结构来组织,存储和管理数据的应用程序
- 数据库的主要作用就是管理数据,进行增删改查
- Mongodb语法与js类似,容易上手
Mongodb核心概念
数据库
- 数据库是一个数据仓库,数据库服务下可以创建很多数据库,数据库中存放很多集合
集合
- 集合类似js中的数组,在集合中存放很多文档
文档
- 文档是数据库的最小单位
- 也就是对象里面的字段也叫文档
安装Mongodb
运行地址
步骤1
- bin目录下cmd,mongod
步骤2(新起一个cmd)
- bin目录下cmd,mongo
- 这样表明建立链接
- 此时此刻,mongo命令行和mongodb交互
命令行交互
数据库命令
- 显示所有的数据库
show dbs
- 切换到指定的数据库,如果不存在会自动创建
use 数据库名
- 显示当前所在的数据库
db
- 删除当前数据库
use 库名
db.dropDatabase()
集合命令
- 创建集合
db createCollection('users')
- 显示当前所在的数据库的所有集合
show collections
- 删除某个集合
db.集合名.drop()
- 重命名某个集合
db.集合名.renameCollection('新集合名')
文档命令
- 插入文档
db.集合名.insert('文档对象')
- 查询文档
db.集合名.find('查询条件')
- 更新文档
db.集合名.update(查询条件,新的文档)
db.集合名.update({name:'李四'},{$set:{age:19}})
//$set很重要
- 删除文档
db.集合名.remove(查询条件)
Mongoose
- 是一个对象文档模型库
- 作用是方便使用代码操作mongodb数据库
- 官网
// 1.安装mongoose
// 2.导入mongoose
const mongoose = require('mongoose');
//设置strictQuery为true,消除警告
mongoose.set('strictQuery', true);
// 3.连接mongodb服务
mongoose.connect('mongodb://127.0.0.1:27017/lusheng');// 4,设置成功/错误/关闭回调,once一次,事件只执行一次,on是会再次执行
mongoose.connection.once('open', () => {console.log('服务连接成功');// 关闭mongodb链接;// mongoose.disconnect();
});
mongoose.connection.on('error', () => {console.log('服务连接失败');
});
mongoose.connection.on('close', () => {console.log('服务连接终止');
});
设置运行命令
"scripts": {"mongoose": "node mongoose.js"},
npm run mongoose
字段类型
字段值验证
- unique必须重建集合才生效
// 4,设置成功/错误/关闭回调,once一次,事件只执行一次,on是会再次执行
mongoose.connection.once('open', () => {console.log('服务连接成功');// 5,创建文档的结构对象//设置集合中文档的属性以及属性值的类型let UserSchema = new mongoose.Schema({name: {type:String,required:true, //表明该属性 不能为空unique:true //设置唯一值,不能重复},auther: {type:String,default:'匿名' //设置默认值},price: {type:Number,enum:[0,1] //设置的值必须是数组中的},isvip: Boolean,list: Array,createtime: Date,});// 6,创建模型对象。对文档操作的封装对象,参数一是集合对象,参数2是结构对象let UserModel = new mongoose.model('userInfo', UserSchema);//7,新增UserModel.create({// name: '用户1',auther: '乞力马扎罗',price: 99,isvip: true,list: [1, 2, 3, 4, 5, 6],createtime: new Date(),}).then((data) => {console.log(data,"正确");}).catch((err) => {console.log(err,"错误");});// 关闭mongodb链接;// mongoose.disconnect();
});
mongoose.connection.on('error', () => {console.log('服务连接失败');
});
mongoose.connection.on('close', () => {console.log('服务连接终止');
});
Mongoose新增文档
// 4,设置成功/错误/关闭回调,once一次,事件只执行一次,on是会再次执行
mongoose.connection.once('open', () => {console.log('服务连接成功');// 5,创建文档的结构对象//设置集合中文档的属性以及属性值的类型let UserSchema = new mongoose.Schema({name: String,auther: String,price: Number,isvip: Boolean,list: Array,createtime: Date,});// 6,创建模型对象。对文档操作的封装对象,参数一是集合对象,参数2是结构对象let UserModel = new mongoose.model('userInfo', UserSchema);//7,新增UserModel.create({name: '用户1',auther: '乞力马扎罗',price: 99,isvip: true,list: [1, 2, 3, 4, 5, 6],createtime: new Date(),}).then((data) => {console.log(data);}).catch((err) => {console.log(err);});// 关闭mongodb链接;// mongoose.disconnect();
});
mongoose.connection.on('error', () => {console.log('服务连接失败');
});
mongoose.connection.on('close', () => {console.log('服务连接终止');
});
Mongoose删除文档
- 新版只支持.then.catch方式获取回调函数
- 单条删除
// 删除单条文档UserModel.deleteOne({_id:'66136481cd016b90b634f712'}).then((user) => {// 你的逻辑console.log(user);}).catch((error) => {// 错误处理});
- 批量删除
UserModel.deleteMany({name:'用户1'}).then((user) => {// 你的逻辑console.log(user)}).catch((error) => {// 错误处理});
Mongoose更新文档
- 更新单条文档
//参数一,条件,参数二,内容,参数三,回调方法UserModel.updateOne({ name: '乞力马扎罗1' },{$set:{name: '乞力马扎罗'}}).then((user) => {// 你的逻辑console.log(user)}).catch((error) => {// 错误处理});
- 更新多条文档
// 使用updateMany方法更新多个文档UserModel.updateMany({ name: '乞力马扎罗1' }, {$set:{name: '乞力马扎罗'}}).then((result) => {// result包含了更新的文档数量等信息console.log(result);}).catch((error) => {// 错误处理console.error(error);});
Mongoose读取文档
- 通过条件进行查找
UserModel.findOne({ name: '乞力马扎罗1' }).then((user) => {// 你的逻辑console.log(user)}).catch((error) => {// 错误处理});
- 通过id进行查找
//通过id进行查找UserModel.findById('6613649acd016b90b634f714').then((user) => {// 你的逻辑console.log(user);}).catch((error) => {// 错误处理});
- 批量查找
UserModel.find({name:'乞力马扎罗1'}).then((user) => {// 你的逻辑console.log(user);}).catch((error) => {// 错误处理});
- 查找所有
UserModel.find().then((user) => {// 你的逻辑console.log(user);}).catch((error) => {// 错误处理});
条件控制
UserModel.find({age:{$lt:19}}).then((user) => {// 你的逻辑console.log(user);}).catch((error) => {// 错误处理});
个性化读取
字段筛选
- select
- 目前的查询时返回该文档的全部信息
- 字段筛选可以返回文档中的特定信息
- 1代表要,0代表不要
UserModel.find().select({ name: 1, age: 1, _id: 0 }).exec().then((user) => {// 你的逻辑console.log(user);}).catch((error) => {// 错误处理});
数据排序
- sort 排序
- 1升序
- -1倒序
- 案例:按照年龄升序
UserModel.find().select({ name: 1, age: 1, _id: 0 }).sort({ age: 1 }).exec().then((user) => {// 你的逻辑console.log(user);}).catch((error) => {// 错误处理});
数据截取
- skip(),跳过几个
- limit().截取几个
- 将年龄最大的截取出来
UserModel.find().select({ name: 1, age: 1, _id: 0 }).sort({ age: 1 }).limit(1).exec().then((user) => {// 你的逻辑console.log(user);}).catch((error) => {// 错误处理});
- 示例:将年龄第二大的截取出来
UserModel.find().select({ name: 1, age: 1, _id: 0 }).sort({ age: 1 }).skip(1).limit(1).exec().then((user) => {// 你的逻辑console.log(user);}).catch((error) => {// 错误处理});