当前位置: 首页 > news >正文

50.MongoDB快速入门实战

MongoDB概念

MongoDB是一个文档数据库(以 JSON 为数据模型),由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。

原则上 Oracle 和 MySQL 能做的事情,MongoDB 都能做(包括 ACID 事务)。

MongoDB vs 关系型数据库

SQLMongoDB
数据库(database)数据库(database)
表(table)集合(collection)
行(row)文档(document)
列(column)字段(field)
索引(index)索引(index)
主键(primary key)_id
视图(view)视图(view)
表连接(tablejoin)聚合操作($lookup)

MongoDB环境搭建


#启动命令
mongod -f /data/mongodb/conf/mongo.conf --auth
#关闭服务
mongod --port=27017 --dbpath=/data/mongodb/data --shutdown #客户端
mongosh
#进入 mongosh 后
use admin
db.shutdownServer()

MongoDB命令操作

#==============  数据库操作 ==============
#查看所有库
show dbs
# 切换到指定数据库,不存在则创建
use test
# 删除当前数据库  
db.dropDatabase()#==============  集合操作 ==============
#查看集合
show collections
#创建集合
db.createCollection("emp")
#删除集合
db.emp.drop()#==============  用户管理 ==============
# 设置管理员用户名密码需要切换到admin库
use admin  
#创建管理员
db.createUser({user:"lyw",pwd:"123456",roles:["root"]})
# 查看当前数据库所有用户信息 
show users 
#显示可设置权限
show roles 
#显示所有用户
db.system.users.find()
#删除指定用户
db.dropUser("lyw")
#删除当前数据库所有用户db.dropAllUser()#==============  权限管理 ==============
db.grantRolesToUser( "lyw" , [ { role: "clusterAdmin", db: "admin" } ,{ role: "userAdminAnyDatabase", db: "admin"},{ role: "readWriteAnyDatabase", db: "admin"} ])#==============  执行js脚本导入数据 ==============
load("books.js")#==============  文档操作 ==============#保证数据不丢失 设置 writeConcern 参数的示例
#- w:指定写入确认级别。如果指定为数字,则表示要等待写入操作完成的节点数。如果指定为 majority,则表示等待大多数节点完成写入操作。默认为 1,表示等待写入操作完成的节点数为 1。
#- j:表示写入操作是否要求持久化到磁盘。如果设置为 true,则表示写入操作必须持久化到磁盘后才返回成功。如果设置为 false,则表示写入操作可能在数据被持久化到磁盘之前返回成功。默认为 false。
#- wtimeout:表示等待写入操作完成的超时时间,单位为毫秒。如果超过指定的时间仍然没有返回确认信息,则返回错误。默认为 0,表示不设置超时时间。
db.emps.insertOne({ name: "fox", age: 35},{writeConcern: { w: "majority", j: true, wtimeout: 5000 }}
)#批量新增文档
db.emps.insertMany([{ name: "xiaming", age: 18},{ name: "xiaming", age: 18},{ name: "xiaming", age: 18},{ name: "xiaming", age: 18},{ name: "xiaming", age: 18},{ name: "wangwu", age: 80},{ name: "wangwu", age: 80, area:["beijing","shanghai"]}],{writeConcern: { w: "majority", j: true, wtimeout: 5000 }}
)#查询集合中的第一个文档
db.emps.findOne({_id:ObjectId("653a730e3c8a14a69c559e6b")})
db.emps.findOne({age:{$gt:60}})
#查询age大于60的文档
db.emps.find({age:{$gt:60}})
db.emps.find({age:{$gt:60},area:{$in:["beijing"]}})#更新文档
db.emps.updateOne({_id:ObjectId("653a730e3c8a14a69c559e6b")},{$inc:{age:1}})
db.emps.updateMany({name:"xiaming"},{$set:{age:10}})#findAndModify兼容了查询和修改指定文档的功能
db.emps.findAndModify({query:{_id:ObjectId("653a730e3c8a14a69c559e6b")},update:{name:"jiutian"},new: true
})#删除文档
db.emps.deleteOne ({ name:"jiutian" })
#删除集合下全部文档
db.emps.deleteMany ({})  #==============  批量操作 bulkwrite() ==============
#- insertOne - updateOne - updateMany - replaceOne - deleteOne - deleteMany
db.emps.bulkWrite( [{ insertOne: { document: { _id: 3, type: "beef", size: "medium", price: 6 } } },{ insertOne: { document: { _id: 4, type: "sausage", size: "large", price: 10 } } },{ updateOne: {filter: { type: "cheese" },update: { $set: { price: 8 } }} },{ deleteOne: { filter: { type: "pepperoni"} } },{ replaceOne: {filter: { type: "vegan" },replacement: { type: "tofu", size: "small", price: 4 }} }] )

处理分页问题 – 巧分页

应该避免使用skip/limit形式的分页。使用查询条件+唯一排序条件

固定(封顶)集合

保证数据库只会存储“限额”的数据,超过该限额的旧数据都会被丢弃。

#创建固定集合
db.createCollection("logs",{capped:true,size:4096,max:10})#查看文档的占用空间
db.logs.stats()

适用场景

  • 系统日志,这非常符合固定集合的特征,而日志系统通常也只需要一个固定的空间来存放日志。在MongoDB内部,副本集的同步日志(oplog)就使用了固定集合。

  • 存储少量文档,如最新发布的TopN条文章信息。得益于内部缓存的作用,对于这种少量文档的查询是非常高效的。

http://www.lryc.cn/news/207470.html

相关文章:

  • 一款功能强大的音乐曲谱软件Guitar Pro 8 .1.1for Mac 中文破解版
  • 图论基础和表示
  • STM32 音频ADC转wav格式
  • 面试中经常问道的问题二
  • SQL UPDATE 语句(更新表中的记录)
  • js节流和防抖
  • 权限系统设计(转载)
  • 【机器学习合集】标准化与池化合集 ->(个人学习记录笔记)
  • Dockerfile文件自动化生成R4L镜像
  • 基于SSM的居家养老系统
  • [C#基础训练]FoodRobot食品管理部分代码-2
  • docker部署rabbitmq的坑
  • 【python VS vba(系列2)】 python和vba读写EXCEL文件的方式比较 (建设ing)
  • 小程序 swiper滑动 层叠滑动效果
  • 【20年VIO梳理】
  • Java Object类详解
  • Unity 中忽略图片透明度的 Image 组件的修改版本
  • hibernate源码(1)--- schema创建
  • 数学与经济管理
  • 自动化测试系列 —— UI自动化测试
  • 眨个眼就学会了PixiJS
  • WORD中的表格内容回车行距过大无法调整行距
  • MySQL 高级函数整理
  • UG\NX二次开发 连接曲线、连结曲线 UF_CURVE_auto_join_curves
  • python爬虫入门(四)爬取猫眼电影排行(使用requests库和正则表达式)
  • Mybatis-Plus CRUD
  • 【强化学习】08——规划与学习(采样方法|决策时规划)
  • (链表) 25. K 个一组翻转链表 ——【Leetcode每日一题】
  • VisualStudio[WPF/.NET]基于CommunityToolkit.Mvvm架构开发
  • 深度学习_5_模型拟合_梯度下降原理