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. 默认库

  1. **admin: ** 从权限的角度来看, 这是 root 数据库。要是讲一个用户添加到这个数据库, 这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行, 比如累出所有的数据库或者关闭服务器
  2. **local: ** 这个数据永远不会被集群复制, 可以用来存储限于本地单台服务器的任意集合
  3. **config: ** 当Mongo用于分片设置时, config数据库在内部使用, 用户保存分片的相关信息

4. 查看正在使用的库

db

5. 查看库中所有的 集合/表

show collections

show tables

6. 删除库

主要用来删除已经持久化的数据库

use articledb
db.dropDatabase()

3. 集合

**注意: ** 在 MongoDB 中, 集合只有在有内容插入后才会创建, 也就是说在创建集合后, 需要再插入一个文档, 集合才会真正创建

1. 创建

1. 显示创建

db.createCollection(name)

**参数说明: **

  1. 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 操作符将条件进行关联 (相当于 SQLand)

查询评论结合中 likenum 大于等于700 并且 小于 2000 的文档

db.comment.find({$and: [{likenum: {$gte: NumberInt(700)}}, {likenum: {$lt: NumberInt(2000)}}]})

2. or

如果两个条件以上之间的关系是 的关系, 则使用 $or (相当于 SQLor)

查询评论集合中 userid 为 1003 或者 点赞数小于 1000 的文档

db.comment.find({$or: [{userid: "1003", {likenum: {$lt: NumberInt(1000)}}]})
posted @ 2024-07-30 17:08  河图s  阅读(28)  评论(0)    收藏  举报