MongoDB 入门实战(3)--命令行
本文主要介绍 MongoDB 命令行的使用,使用到的软件版本:MongoDB 5.0.5、Centos 7.6。
1、mongo 语法
mongo 命令在 bin 目录下,用法如下:
./mongo [options] [db address] [file names (ending in .js)]
常用参数:
--host 主机
--port 端口
-u [ --username ] 用户名
-p [ --password ] 密码
详细的说明可查看帮助:
./mongo -h
例子:
cd $MONGODB_HOME/bin
./mongo
2、命令
2.1、数据库
A、切换数据库(没有会先创建数据库):use DATABASE_NAME
B、删除数据库:db.dropDatabase():
例子:
> use testdb
> db.dropDatabase()
2.2、集合
A、创建集合
db.createCollection(name, options)
name: 集合名称
options: 可选参数,如下所示:
字段 | 类型 | 描述 |
---|---|---|
capped | 布尔 | 是否创建固定集合;如果为 true,必须指定 size 参数。 |
size | 数值 | 固定集合的大小。 |
max | 数值 | 固定集合包含的最大文档数。 |
B、列出集合:show collections
C、删除集合:db.collection.drop()
例子:
> use testdb > db.createCollection('col1') > show collections > db.col1.drop()
2.3、文档
2.3.1、创建文档
插入一个文档:
db.collection.insertOne( <document>, { writeConcern: <document> } )
插入多个文档:
db.collection.insertMany( [ <document 1> , <document 2>, ... ], { writeConcern: <document>, ordered: <boolean> } )
参数说明:
document:要写入的文档。
writeConcern:写入策略,是否需确认写操作;1:需确认,0 无需确认;默认为 1。
ordered:是否按顺序写入,默认 true。
例子:
> db.col1.insertOne({name:'jack',age:20})
2.3.2、更新文档
更新第一个匹配的文档:
db.collection.updateOne( <filter>, <update>, { upsert: <boolean>, writeConcern: <document>, collation: <document>, arrayFilters: [ <filterdocument1>, ... ], hint: <document|string> // Available starting in MongoDB 4.2.1 } )
更新所有匹配的文档:
db.collection.updateMany( <filter>, <update>, { upsert: <boolean>, writeConcern: <document>, collation: <document>, arrayFilters: [ <filterdocument1>, ... ], hint: <document|string> // Available starting in MongoDB 4.2.1 } )
参数说明:
filter: 查询条件,类似 sql 的 where 条件
update: 更新的对象,可理解为 sql 的 set 子句
upsert: 可选,如果查询不到文档,是否插入更新的文档;默认 false
writeConcern: 可选,写入策略,是否需确认写操作;1:需确认,0 无需确认
collation: 可选,排序规则
arrayFilters: 过滤器
hint: 查询时使用索引
例子:
> db.col1.updateOne({name:'jack'},{$set:{name:'jack2',age:22}})
2.3.3、删除文档
删除第一个匹配的文档:
db.collection.deleteOne( <filter>, { writeConcern: <document>, collation: <document>, hint: <document|string> // Available starting in MongoDB 4.4 } )
删除所有匹配的文档:
db.collection.deleteMany( <filter>, { writeConcern: <document>, collation: <document> } )
参数说明:
filter: 查询条件,类似 sql 的 where 条件
writeConcern: 可选,写入策略,是否需确认写操作;1:需确认,0 无需确认
collation: 可选,排序规则
hint: 查询时使用索引
例子:
> db.col1.deleteOne({name:'jack2'})
2.3.4、查询文档
查询第一个匹配的文档:
db.collection.findOne(query, projection)
查询所有匹配的文档:
db.collection.find(query, projection)
参数说明:
query:可选,查询条件
projection:可选,指定查询返回的键
例子:
> db.col1.find() > db.col1.find({},{_id:0})
2.3.5、条件操作符
MongoDB 与 SQL 中条件操作符的比较:
操作 | 格式 | 范例 | RDBMS中的类似语句 |
---|---|---|---|
等于 | {<key>:<value> } |
db.col.find({"name":"jack"}).pretty() |
where by = 'jack' |
小于 | {<key>:{$lt:<value>}} |
db.col.find({"age":{$lt:50}}).pretty() |
where age< 50 |
小于或等于 | {<key>:{$lte:<value>}} |
db.col.find({"age":{$lte:50}}).pretty() |
where age<= 50 |
大于 | {<key>:{$gt:<value>}} |
db.col.find({"age":{$gt:50}}).pretty() |
where age> 50 |
大于或等于 | {<key>:{$gte:<value>}} |
db.col.find({"age":{$gte:50}}).pretty() |
where age>= 50 |
不等于 | {<key>:{$ne:<value>}} |
db.col.find({"age":{$ne:50}}).pretty() |
where age!= 50 |
MongoDB AND 条件:传入多个字段,字段之间为 and 的关系。
db.col.find({key1:value1, key2:value2})
MongoDB OR 条件:通过 $or 关键字来实现。
db.col.find({$or: [{key1: value1}, {key2:value2}]}
例子:
> db.col1.find({name:'jack',age:{$lt:50}}) #相当于 name='jack' and age<50 > db.col1.find({age:{$lt:50},$or:[{name:'jack'},{name:'luci'}]}) #相当于 age<50 and (name='jack' or name='luci')
2.3.6、$type 操作符
$type 操作符用于检索匹配的数据类型。
例子:
> db.col1.find({name:{$type:'string'}}) > db.col1.find({name:{$type:2}})
2.3.7、MongoDB skip 与 limit方法
skip 表示跳过指定数量的文档,limit 表示读取指定数量的文档。
例子:
> db.col1.find().skip(1).limit(2)
2.3.8、MongoDB 排序
MongoDB 中使用 sort() 方法对数据进行排序
db.COLLECTION_NAME.find().sort({KEY:1})
1 表示升序,-1 表示降序
例子:
> db.col1.find().sort({name:1})
2.3.9、MongoDB 聚合
MongoDB 中使用 aggregate 方法来实现聚和功能:
db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
相应聚合的表达式如下:
表达式 | 描述 | 实例 | 类似 SQL |
---|---|---|---|
$sum | 计算总和 | db.col1.aggregate([{$group: {_id: "$name", num: {$sum : "$age"}}}]) | select name,sum(age) from col1 group by name |
db.col1.aggregate([{$group: {_id: "$name", num: {$sum : 1}}}]) | select name,count(*) from col1 group by name | ||
$avg | 计算平均值 | db.col1.aggregate([{$group: {_id: "$name", num: {$avg: "$age"}}}]) | select name,avg(age) from col1group by name |
$min | 获取最小值。 | db.col1.aggregate([{$group: {_id: "$name", num: {$min: "$age"}}}]) | select name,min(age) from col1group by name |
$max | 获取最大值 | db.col1.aggregate([{$group: {_id: "$name", num: {$max: "$age"}}}]) | select name,max(age) from col1group by name |
$first | 获取第一条数据 | db.col1.aggregate([{$group: {_id: "$name", num: {$first: "$age"}}}]) | |
$last | 获取最后一条数据 | db.col1.aggregate([{$group: {_id: "$name", num: {$last: "$age"}}}]) |
管道的概念:
MongoDB 的聚合管道将 MongoDB 文档在一个管道处理完毕后将结果传递给下一个管道处理。MongoDB 聚合中常用的操作:
$project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
$match:用于过滤数据,只输出符合条件的文档。
$limit:只返回指定的文档数。
$skip:跳过指定的文档数。
$group:将文档分组,可用于数据统计。
$sort:文档排序输出。
例子:
> db.col1.aggregate([{$group: {_id: "$name", num: {$avg: "$age"}}},{$project:{num:0}}]) > db.col1.aggregate([{$group: {_id: "$name", num: {$avg: "$age"}}},{$match:{_id:'jack'}}]) > db.col1.aggregate([{$group: {_id: "$name", num: {$avg: "$age"}}},{$limit:2}]) > db.col1.aggregate([{$group: {_id: "$name", num: {$avg: "$age"}}},{$sort:{num:1}}])
2.4、索引
2.4.1、创建索引
db.collection.createIndex(keys, options, commitQuorum)
keys:指定创建索引的字段及索引方式(按升序创建索引还是按降序创建索引;1:升序,-1:降序)
options:可选参数
commitQuorum:确定提交的仲裁数量
可选参数如下:
参数 | 类型 | 描述 |
---|---|---|
background | Boolean | 4.2 版本已废弃。是否阻塞对聚合的其他操作。 |
unique | Boolean | 是否为唯一索引,默认 false。 |
name | string | 索引名称,如果未指定,则通过拼接索引的字段名和排序方式来生成索引名称。 |
sparse | Boolean | 如果为 true,则索引仅引用具有指定字段的文档。默认值为 false。 |
expireAfterSeconds | integer | 设置集合的存在时间,单位为秒。 |
weights | document | 对于文本索引,指定索引权重,1 到 99999 之间,表示该索引字段相对于其他索引字段的得分权重;可以为部分或全部索引字段指定权重。 |
default_language | string | 对于文本索引,指定语言; 默认为英语。 |
language_override | string | 对于文本索引,指定覆盖的语言,默认值为 language。 |
例子:
> db.col1.createIndex({name:1})
2.4.2、查询索引
db.collection.getIndexes()
例子:
> db.col1.getIndexes()
2.4.3、删除索引
db.col.dropIndex(INDEX_NAME)
db.col.dropIndexes()
例子:
> db.col1.dropIndex('name_1') > db.col1.dropIndexes()
2.5、权限
2.5.1、创建用户
db.createUser(user, writeConcern)
user: 用户信息
writeConcern: 可选,写入策略,是否需确认写操作;1:需确认,0 无需确认
例子:
> use testdb > db.createUser({ ... user: 'test', ... pwd: '123456', ... roles:[{ ... role: 'dbOwner', ... db: 'testdb' ... }] ... })
2.5.2、更新用户
db.updateUser(username, update, writeConcern)
username: 用户名
update: 更新信息
writeConcern: 可选,写入策略,是否需确认写操作;1:需确认,0 无需确认
例子:
> db.updateUser('test',{pwd:'1234567'})
2.5.3、删除用户
db.dropUser(username, writeConcern)
username: 用户名
writeConcern: 可选,写入策略,是否需确认写操作;1:需确认,0 无需确认
2.5.4、认证
如何数据库开启的权限认证(启动时增加 --auth 参数),则需要先认证再执行相应的操作:
db.auth(<username>, <password>)