50.MongoDB快速入门实战

MongoDB概念

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

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

MongoDB vs 关系型数据库

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

MongoDB环境搭建

shell 复制代码
#启动命令
mongod -f /data/mongodb/conf/mongo.conf --auth
#关闭服务
mongod --port=27017 --dbpath=/data/mongodb/data --shutdown 

#客户端
mongosh
#进入 mongosh 后
use admin
db.shutdownServer()

MongoDB命令操作

shell 复制代码
#==============  数据库操作 ==============
#查看所有库
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形式的分页。使用查询条件+唯一排序条件

固定(封顶)集合

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

shell 复制代码
#创建固定集合
db.createCollection("logs",{capped:true,size:4096,max:10})

#查看文档的占用空间
db.logs.stats()

适用场景

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

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

相关推荐
ccecw12 分钟前
Mysql ONLY_FULL_GROUP_BY模式详解、group by非查询字段报错
数据库·mysql
JH307315 分钟前
达梦数据库与MySQL的核心差异解析:从特性到实践
数据库·mysql
数据知道31 分钟前
PostgreSQL 核心原理:如何利用多核 CPU 加速大数据量扫描(并行查询)
数据库·postgresql
麦聪聊数据2 小时前
Web 原生架构如何重塑企业级数据库协作流?
数据库·sql·低代码·架构
未来之窗软件服务2 小时前
数据库优化提速(四)新加坡房产系统开发数据库表结构—仙盟创梦IDE
数据库·数据库优化·计算机软考
Goat恶霸詹姆斯3 小时前
mysql常用语句
数据库·mysql·oracle
大模型玩家七七4 小时前
梯度累积真的省显存吗?它换走的是什么成本
java·javascript·数据库·人工智能·深度学习
曾经的三心草4 小时前
redis-9-哨兵
数据库·redis·bootstrap
space62123274 小时前
在SpringBoot项目中集成MongoDB
spring boot·后端·mongodb
明哥说编程4 小时前
Dataverse自定义表查询优化:D365集成大数据量提速实战【索引配置】
数据库·查询优化·dataverse·dataverse自定义表·索引配置·d365集成·大数据量提速