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环境搭建
#启动命令
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)就使用了固定集合。文章来源:https://www.toymoban.com/news/detail-735303.html
-
存储少量文档,如最新发布的TopN条文章信息。得益于内部缓存的作用,对于这种少量文档的查询是非常高效的。文章来源地址https://www.toymoban.com/news/detail-735303.html
到了这里,关于50.MongoDB快速入门实战的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!