MongoDB --- 常用命令
0. 案例需求
存放文章评论数据到 MongoD 数据库名为 articledb 数据库结构如下
| 文章评论 | comment | ||
|---|---|---|---|
| 字段名称 | 字段含义 | 字段类型 | 备注 |
| _id | ID | ObjectId或String | Mongo的主键字段 |
| articleid | 文章ID | String | |
| content | 评论内容 | String | |
| userid | 评论人ID | String | |
| nickname | 评论人昵称 | String | |
| createdatetime | 评论的日期事时间 | Date | |
| likenum | 点赞数 | Int32 | |
| replynum | 回复数 | Int32 | |
| state | 状态 | String | 0: 不可见; 1: 可见 |
| parentid | 上级评论ID | String | 如果为0, 表示该评论为文章的顶级评论 |
1. shell 命令
1. 连接
mongo --host
2. 库
1. 选择和创建库
如果没有该名称的库, 则会自动创建, MongoDB中默认的库为 test, 如果你没有选择库, 集合自动存放在 test 库中, 如果创建库的时候没有创建集合, 这个库存在于内存中的
use articledb
2. 查看所有库
查看的是当前用户有权限查看的库
show dbs
show databases
3. 默认库
- **admin: ** 从权限的角度来看, 这是
root数据库。要是讲一个用户添加到这个数据库, 这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行, 比如累出所有的数据库或者关闭服务器 - **local: ** 这个数据永远不会被集群复制, 可以用来存储限于本地单台服务器的任意集合
- **config: ** 当Mongo用于分片设置时, config数据库在内部使用, 用户保存分片的相关信息
4. 查看正在使用的库
db
5. 查看库中所有的 集合/表
show collections
show tables
6. 删除库
主要用来删除已经持久化的数据库
use articledb
db.dropDatabase()
3. 集合
**注意: ** 在 MongoDB 中, 集合只有在有内容插入后才会创建, 也就是说在创建集合后, 需要再插入一个文档, 集合才会真正创建
1. 创建
1. 显示创建
db.createCollection(name)
**参数说明: **
- name: 要创建的集合名称
**示例: **
创建一个名为 comment 的普通集合
db.createCollection(comment)
2. 隐式创建
# 如果没有这个集合, 则会隐式的创建集合, 并插入文档
db.集合名.insert({})
# 只可以插入单文档
db.集合名.save({})
2. 查看 集合/表
show collections
show tables
3. 删除
db.集合名.drop()
4. 文档
1. 增
1. 单文档
# 如果没有这个集合, 则会隐式的创建集合, 并插入文档
db.集合名.insert(
<document or array of documents>,
{
writeConcern: <document>,
ordered: <boolean>
}
)
db.集合名.save(
<document or array of documents>,
{
writeConcern: <document>,
ordered: <boolean>
}
)
**参数说明: **
| Parameter | Type | 解释 | Description |
|---|---|---|---|
| document | document or array | 要插入的文档或文档数组 | 要插入到集合中的文档或文档数组 (JSON 格式) |
| writeConcern | document | 性能和可靠性的级别 | |
| ordered | boolean | 是否排序 | 可选值, 在 2.6+ 默认为 true如果为真, 则按书序插入数组中的文档, 如果其中一个文档出现错误, MongoDB将返回而不处理数组中的其余文档 如果为假, 则执行无序插入, 如果其中一个文档出现错误, 则继续处理数组中的主文档。 |
**示例: **
db.comment.insert(
{
"articleid": 100000,
"content": "今天天气阳光明媚",
"userid": "1001",
"nickname": "Rose",
"createdatetime": new Date(),
"likenum": NumberInt(10),
"state": null
}
)
2. 多文档
# 如果没有这个集合, 则会隐式的创建集合, 并插入文档
db.集合名.insertMany(
[ <document 1>, <document 2>, ... ],
{
writeConcern: <document>,
ordered: <boolean>
}
)
**参数说明: **
| Parameter | Type | 解释 | Description |
|---|---|---|---|
| document | document or array | 要插入的文档或文档数组 | 要插入到集合中的文档或文档数组 (JSON 格式) |
| writeConcern | document | 性能和可靠性的级别 | |
| ordered | boolean | 是否排序 | 可选值, 在 2.6+ 默认为 true如果为真, 则按书序插入数组中的文档, 如果其中一个文档出现错误, MongoDB将返回而不处理数组中的其余文档 如果为假, 则执行无序插入, 如果其中一个文档出现错误, 则继续处理数组中的主文档。 |
**示例: **
db.comment.insertMany([
{
"articleid": 100000,
"content": "今天天气阳光明媚",
"userid": "1001",
"nickname": "Rose",
"createdatetime": new Date(),
"likenum": NumberInt(10),
"state": null
},
{
"articleid": 100001,
"content": "今天天气阳光明媚2",
"userid": "1002",
"nickname": "Rose2",
"createdatetime": new Date(),
"likenum": NumberInt(11),
"state": null
},
{
"articleid": 100002,
"content": "今天天气阳光明媚3",
"userid": "1003",
"nickname": "Rose3",
"createdatetime": new Date(),
"likenum": NumberInt(12),
"state": null
},
])
3. 多文档插入失败的解决方案
直接执行下面的 try catch 命令
try {
db.comment.insertMany([
{
"articleid": 100000,
"content": "今天天气阳光明媚",
"userid": "1001",
"nickname": "Rose",
"createdatetime": new Date(),
"likenum": NumberInt(10),
"state": null
},
{
"articleid": 100001,
"content": "今天天气阳光明媚2",
"userid": "1002",
"nickname": "Rose2",
"createdatetime": new Date(),
"likenum": NumberInt(11),
"state": null
},
{
"articleid": 100002,
"content": "今天天气阳光明媚3",
"userid": "1003",
"nickname": "Rose3",
"createdatetime": new Date(),
"likenum": NumberInt(12),
"state": null
},
])
} catch (e) {
print(e)
}
2. 删
1. 删文档(慎用)
db.comment.remove({})
2. 删记录
# 默认删除所有符合条件的记录
db.comment.remove({_id: "1"})
3. 改
1. 文档修改
db.集合名.update(query, update, options)
db.集合名.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <bollean>,
writeConcern: <document>,
collation: <document>,
arrayFilters: [ <filterdocument1>, ...],
hint: <document|string> # 4.2 以后的新参数
}
)
**参数说明: **
| Parameter | Type | 解释 | Description |
|---|---|---|---|
| query | document | 更新的选择条件 | 可以使用与 find() 方法中相同的查询选择器, 类似 sql update 查询内 where 后面的参数, 在3.0 版中进行了更改: 当使用 upsert: true 来执行 update() 时, 如果查询使用点表示法在 _id 字段上指定条件, 则 MongoDB 将拒绝插入新文档 |
| update | document or pipeline | 要应用的修改 | 该值可以是: 包含更新运算符表达式的文档, 或仅包含 field: value 对的替换文档, 在 MongoDB4.2 中启动聚合管道, 管道可以由一下阶段组成: $addFields 及其别名 $set、$project 及其别名 $unset 、$replaceroot 及其别名 $replaceWith。换句话说: 它是update 的对象和一些更新的操作符(如$set...等), 也可以理解为sql update 查询内 set 后面的值 |
| upsert | boolean | 可选 | 默认值: false如果设置为 true, 则在没有与查询条件匹配的文档时, 创建新文档, 如果设置为 false, 则不会插入新文档 |
**示例: **
修改_id为1的记录的点赞量为1001, 执行完后, 会发现整个文档被 新的文档给替换了
db.comment.update({_id: "1"}, {likenum: NubmerInt(1001)})
2. 字段修改
db.集合名.update(query, {$set: update}, options)
db.集合名.update(
<query>,
<$set: update>,
{
upsert: <boolean>,
multi: <bollean>,
writeConcern: <document>,
collation: <document>,
arrayFilters: [ <filterdocument1>, ...],
hint: <document|string> # 4.2 以后的新参数
}
)
**参数说明: **
| Parameter | Type | 解释 | Description |
|---|---|---|---|
| query | document | 更新的选择条件 | 可以使用与 find() 方法中相同的查询选择器, 类似 sql update 查询内 where 后面的参数, 在3.0 版中进行了更改: 当使用 upsert: true 来执行 update() 时, 如果查询使用点表示法在 _id 字段上指定条件, 则 MongoDB 将拒绝插入新文档 |
| update | document or pipeline | 要应用的修改 | 该值可以是: 包含更新运算符表达式的文档, 或仅包含 field: value 对的替换文档, 在 MongoDB4.2 中启动聚合管道, 管道可以由一下阶段组成: $addFields 及其别名 $set、$project 及其别名 $unset 、$replaceroot 及其别名 $replaceWith。换句话说: 它是update 的对象和一些更新的操作符(如$set...等), 也可以理解为sql update 查询内 set 后面的值 |
| upsert | boolean | 可选 | 默认值: false如果设置为 true, 则在没有与查询条件匹配的文档时, 创建新文档, 如果设置为 false, 则不会插入新文档 |
**示例: **
修改_id为1的记录的点赞量为1001, 执行完后, 会发现只替换了 likenum 字段
db.comment.update({_id: "1"}, {$set: {likenum: NubmerInt(1001)}})
3. 批量修改
默认只修改符合查询条件的第一条数据
db.集合名.update(query, update, options)
db.集合名.update(
<query>,
update>,
{
upsert: <boolean>,
multi: <bollean>,
writeConcern: <document>,
collation: <document>,
arrayFilters: [ <filterdocument1>, ...],
hint: <document|string> # 4.2 以后的新参数
}
)
**参数说明: **
| Parameter | Type | 解释 | Description |
|---|---|---|---|
| query | document | 更新的选择条件 | 可以使用与 find() 方法中相同的查询选择器, 类似 sql update 查询内 where 后面的参数, 在3.0 版中进行了更改: 当使用 upsert: true 来执行 update() 时, 如果查询使用点表示法在 _id 字段上指定条件, 则 MongoDB 将拒绝插入新文档 |
| update | document or pipeline | 要应用的修改 | 该值可以是: 包含更新运算符表达式的文档, 或仅包含 field: value 对的替换文档, 在 MongoDB4.2 中启动聚合管道, 管道可以由一下阶段组成: $addFields 及其别名 $set、$project 及其别名 $unset 、$replaceroot 及其别名 $replaceWith。换句话说: 它是update 的对象和一些更新的操作符(如$set...等), 也可以理解为sql update 查询内 set 后面的值 |
| upsert | boolean | 可选 | 默认值: false如果设置为 true, 则在没有与查询条件匹配的文档时, 创建新文档, 如果设置为 false, 则不会插入新文档 |
**示例: **
修改所有 userid 为 1003 的记录的昵称为张三
# 文档批量修改
db.comment.update({userid: "1003"}, {nickname: "张三"}, {multi: true})
# 字段批量修改
db.comment.update({userid: "1003"}, {$set: {nickname: "张三"}}, {multi: true})
4. 列值增长修改
如果想要实现某列值在原有值的基础上进行增加或减少, 可以使用 $inc 运算符来实现
# 增加 1
db.comment.update({_id: "3"},{$inc:{likenum: NumberInt(1)}})
# 减少 1
db.comment.update({_id: "3"},{$dei:{likenum: NumberInt(1)}})
4. 查
1. find()
db.集合名.find(<query>,[projection])
**参数说明: **
| Parameter | Type | Description |
|---|---|---|
| query | document | 可选可以使用查询运算符指定选择筛选器。若要返回集合中的所有文档, 可以省略此参数或传递空文档 {} |
| projection | document | 可选可以指定在与查询筛选器匹配的文档中返回的字段 (投影)。若要返回匹配文档中改的所有字段, 可以忽略此参数 |
**示例: **
查询 comment 集合中的所有文档
db.comment.find()
db.comment.find({})
查询所有 userid 为 1001 的文档
db.comment.find({ userid: "1001" })
2. findOne()
只查 userid 为 1001 的前一条
db.comment.findOne({ userid: "1001" })
3. 投影查询 (Projection Query)
如果要查询结果只返回部分字段, 则需要使用投影查询来指定查询的字段
查询所有 userid 为 1001 的文档,并且只返回 article 字段, _id是会默认返回的
db.comment.find({ userid: "1001" },{ articleid: 1})
查询所有 userid 为 1001 的文档,并且只返回 article 字段, 排除_id
db.comment.find({ userid: "1001" },{ articleid: 1, _id: 0})
查询所有 userid 为 1001 的文档,并且只返回 article, nickname 字段, _id是会默认返回的
db.comment.find({ userid: "1001" },{ articleid: 1, nickname: 1})
4. 统计查询 ( count )
db.集合名.count(query, projection)
**参数说明: **
| Parameter | Type | Description |
|---|---|---|
| query | document | 查询选择条件 |
| projection | document | 可选用于修改奇数的额外选项 |
**示例: **
统计 comment 集合所所有的记录数量
db.comment.count()
统计 comment 集合的 userid 为 1003 的数量
db.comment.count({userid: "1003"})
5. 分页查询 ( limit & skip )
**1. 使用 limit() 读取指定数量的数据, 使用 skip() 来跳过指定数量的数据, **
第一页: skip(0), 查3条
# limit 默认值为 20
db.comment.find().skip(0).limit(3)
# 方法执行的顺序无所谓
db.comment.find().limit(3).skip(0)
第二页: skip(3), 查3条
db.comment.find().skip(3).limit(3)
# 方法执行的顺序无所谓
db.comment.find().skip(0).limit(3)
6. 排序查询 ( sort )
sort() 方法用于对数据进行排序. 通过参数指定排序的字段, 并使用 1和 -1 来指定排序方式, 1为升序, -1为降序
# 默认以 _id 为升序
db.comment.find().sort({userid: -1,likename: 1})
skip() limit() sort() 三条命令同时执行时, 执行顺序是 sort() skip() limit()
7. 正则查询
db.集合.find({字段: /正则表达式/})
**示例: **
查询评论内容中包含 '开水' 的所有文档
db.comment.find({content: /开水/})
查询评论的内容中以 '专家' 开头的所有文档
db.comment.find({content: /^专家/})
8. 比较查询
db.comment.find({likenum: {$gt: NumberInt(100)}}) # 大于
db.comment.find({likenum: {$lt: NumberInt(100)}}) # 小于
db.comment.find({likenum: {$gte: NumberInt(100)}}) # 大于等于
db.comment.find({likenum: {$lte: NumberInt(100)}}) # 小于等于
db.comment.find({likenum: {$ne: NumberInt(100)}}) # 不等于
9. 包含查询( in )
1. 包含
查询评论中 userid 包含 1003 或 1004的文档
db.find({userid:{$in:["1003", "1004"]}})
2. 不包含
查询评论中 userid 不包含 1003 和 1004的文档
db.find({userid:{$nin:["1003", "1004"]}})
10 条件连接查询 ( and or )
**1. and **
如果想要查询同时满足两个以上的条件, 使用 $and 操作符将条件进行关联 (相当于 SQL 的 and)
查询评论结合中 likenum 大于等于700 并且 小于 2000 的文档
db.comment.find({$and: [{likenum: {$gte: NumberInt(700)}}, {likenum: {$lt: NumberInt(2000)}}]})
2. or
如果两个条件以上之间的关系是 或 的关系, 则使用 $or (相当于 SQL 的 or)
查询评论集合中 userid 为 1003 或者 点赞数小于 1000 的文档
db.comment.find({$or: [{userid: "1003", {likenum: {$lt: NumberInt(1000)}}]})

浙公网安备 33010602011771号