1.Mongo管理
1.启动mongo
mongod -f conf/mongo.conf
2.关闭Mongo
方式1(Server本地执行命令):
mongod --port=27017 --dbpath=data --shutdown
方式2(127连接Mongo的admin库下执行命令):
use admin
db.shutdownServer()
3.Mongo Shell执行JS脚本
load("/xx/xxx/xxx.js")
2.数据库操作
切换数据库,如果不存在则创建之:
use {xxx}
查看所有数据库:
show dbs
说明:刚创建的数据库xxx并不在数据库的列表中, 要显示它,我们需要向xxx数据库插入一些数据.
查看当前正在使用的数据库
db
删除当前数据库
db.dropDatabase()
3.集合操作
查看已有集合
show collections
show tables
创建集合
db.createCollection(name, options)
说明:当集合不存在时,向集合中插入文档也会创建集合
删除集合
db.{xxx}.drop()
查看集合状态
db.{xxx}.stats()
说明:创建集合时可选参数option选项如下:集合操作
4.安全相关
查看当前数据库的用户列表
show users
查看当前数据库的角色列表
show roles
创建应用数据库的用户
db.createUser({user:"test",pwd:"test",roles:["dbOwner"]})
管理员操作
说明:管理员用户操作需要在admin库执行
创建管理员
use admin
db.createUser({user:"test",pwd:"test",roles:["root"]})
说明:不同数据库的用户相互独立。
说明:
MongoDB默认不启用鉴权,生产环境需要以鉴权模式启动MongoDB:
mongod -f conf/mongo.conf --auth
此时客户端连接时,需要认证:
mongo 127.0.0.1:27017 -u test -p test --authenticationDatabase=test123
5.增删改查
基础语法:
插入文档
db.collection.insertOne( <document>, { writeConcern: <document> } )
writeConcern:决定一个写操作落到多少个节点上才算成功,默认为 1
0:不关心是否写入成功
1~n: 指定节点数写入成功
majority: 大部分节点写入成功
db.collection.insertMany(<document>, {writeConcern: <document>,ordered: <boolean>} )
ordered:指定是否按顺序写入,默认 true,按顺序写入
查询
db.collection.find(query, projection)
命令选项:
findOne:查询第一个个文档。
findMany:查询多个文档。
query:查询条件
update:投影操作,指定返回的key
更新文档
db.collection.update(query,update,options)
命令选项:
updateOne:更新单个文档(部分更新,只更新传入字段)。
updateMany:更新多个文档(部分更新,只更新传入字段)。
replaceOne:替换单个文档(全量更新)。
query:描述更新的查询条件;
update:描述更新的动作及新的内容;
options:描述更新的选项
upsert: 可选,如果不存在update的记录,是否插入新的记录。默认false,不插入
multi: 可选,是否按条件查询出的多条记录全部更新。 默认false,只更新找到的第一条记录
writeConcern :可选,决定一个写操作落到多少个节点上才算成功。
删除文档
db.collection.remove(query,justOne)
justOne:为true时仅删除符合条件的第一条记录
推荐使用 deleteOne() 和 deleteMany()
db.collection.deleteMany ({}):删除所有
db.collection.deleteMany ({query}):删除query条件的所有文档
db.collection.deleteMany ({query}):删除query条件的一个文档
操作时报错,可能和版本有关
修改并返回
db.collection.findAndModify()
db.collection.findOneAndUpdate()
删除并返回
db.collection.findOneAndDelete()
插入操作
插入单个文档
db.user.insertOne( {userName:"马超",age:33,weapon:"亮银枪"} )
插入多个文档
db.user.insertMany(
[
{userName:"关羽",weapon:"青龙刀"},
{userName:"赵云",weapon:"亮银枪"}
]
)
插入操作
基础查询:全量查询
投影操作查询:不显示主键ID,只显示userName
条件查询:查询条件:age>30
条件查询:userName=关羽 或 age=24
条件查询:userName=张飞 且 age=24
条件查询:in
排序
分页:每页返回2条,返回第二页
模糊查询
模糊查询:忽略大小写
删除操作
删除单个文档:name=Hero1的一个文档
db.test.deleteOne({name:"Hero1"})
删除多个文档:ip="192.168.2.1"的所有文档
db.test.deleteMany({ip:"192.168.2.1"})
删除多个文档:删除集合下的所有文档
db.test.deleteMany({})
返回被删除文档
更新操作
更新单个文档
db.user.updateOne({userName:"关羽"},{$inc:{age:1}})
更新username=关羽的记录,使其age+1
db.user.updateOne({userName:"赵云"},{$set:{age:22}})
更新username=赵云的记录,使其age=22
更新多个文档
db.test.update({ip:{$regex:"hero",$options:"$i"}},{$set:{abc:123}},{"multi":true})
已过期,不推荐使用
db.test.updateMany({ip:"192.168.0.1"},{$set:{abc:123}})
推荐使用,对IP=192.168.0.1的记录,更新字段abc为123,如果abc字段不存在则创建之
替换更新
更新不存在则创建之
更新并返回更新后的记录
db.people.findAndModify({
query: { name: "Pascal", state: "active", rating: 25 },
sort: { rating: 1 },
update: { $inc: { score: 1 } },
upsert: true,
new: true
})
6.聚合操作
1)单一聚合
2)聚合管道
1.常用操作
1)聚合管道
操作 | 描述 | SQL |
$match | 过滤 | where |
$project | 投影 | as |
$sort | 排序 | order by |
$group | 分组 | group by |
$skip/$limit | 分页 | limit ... from ... |
$lookup | 左外连接 | left out join |
$unwind | 打平数组 | |
$graphLookup | 图搜索 | |
$facet/$bucket | 分面搜索 |
{
$unwind:
{
path: <field path>,
includeArrayIndex: <string>,
#可选,一个新字段的名称用于存放元素的数组索引。该名称不能以$开头。
preserveNullAndEmptyArrays: <boolean>
#可选,default :false,若为true,如果路径为空,缺少或为空数组,则$unwind输出文档
} }
2)分组相关操作
操作 | 描述 |
$avg | 求平均 |
$first | 返回每组的第一个文档 |
$last | 返回每组的最后一个文档 |
$max | 返回分组中指定字段的最大值 |
$min | 返回分组中指定字段的最小值 |
$push | 将指定的表达式的值加入数组中 |
$addToSet | 将指定的表达式的值加入到集合中(无序、无重复) |
$sum | 计算总和 |
$stdDevPop |
返回输入值的总体标准偏差
|
$stdDevSamp |
返回输入值的样本标准偏差
|
默认情况下,分组阶段的内存限制为100M。如果
分组阶段超过此限制,
将产生错误。
大数据量分组处理,可将allowDiskUse选项设置为
true,
以启用
$group
操作以写入临时文件。
2.聚合管道语法
pipeline = [$stage1, $stage2, ...$stageN];
db.collection.aggregate(pipeline, {options})
3.操作样例