一、案例需求背景
核心场景:将专栏文章评论数据存储到 MongoDB,数据库为articledb,核心集合(表)为comment,字段结构如下:
| 字段名称 | 字段含义 | 字段类型 | 备注 |
| _id | 主键 ID | ObjectId 或 String | MongoDB 默认主键 |
| 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. 选择与创建数据库
- 语法:
use 数据库名称(数据库不存在则自动创建)
- 示例:
use articledb(创建并切换到 articledb 数据库)
- 查看所有数据库:
show dbs或show databases - 查看当前使用的数据库:
db - 关键说明:
- 集合(表)需插入文档(记录)后才会真正创建,空数据库不会显示在
show dbs结果中。 - 默认数据库为
test,未选择数据库时数据存于test。 - 数据库命名规范:UTF-8 字符串、非空、不含空格 /.$//\0、全小写、最多 64 字节。
- 保留数据库:
admin:权限根数据库,用户在此库授权后继承所有库权限。local:数据不复制,仅存本地服务器数据。config:分片集群时使用,存储分片配置。
2. 数据库删除
- 语法:
db.dropDatabase()(仅删除已持久化的数据库)
三、集合操作
集合类似关系型数据库的 “表”,支持显式创建和隐式创建。
1. 集合创建
- 显式创建(了解即可):
db.createCollection("集合名称")
- 示例:
db.createCollection("mycollection")
- 隐式创建(推荐):向不存在的集合插入文档时,自动创建集合(无需手动创建)。
- 查看当前库集合:
show collections或show tables
2. 集合命名规范
- 非空字符串,不含 \0(空字符)。
- 不能以
system.开头(系统集合保留前缀)。 - 避免含
$(仅系统生成集合可能包含)。
3. 集合删除
- 语法:
db.集合名称.drop()或db.collection.drop() - 返回值:删除成功返回
true,失败返回false
- 示例:
db.mycollection.drop()(删除 mycollection 集合)
四、文档基本操作(插入)
文档类似关系型数据库的 “记录”,采用 BSON 格式(类似 JSON),核心插入操作如下:
1. 单个文档插入
- 语法:
db.collection.insert(<文档>, {writeConcern: <配置>, ordered: <布尔值>})
- 也可使用
save()方法。
- 示例(插入评论数据):
db.comment.insert({ "articleid": "100000", "content": "今天天气真好,阳光明媚", "userid": "1001", "nickname": "Rose", "createdatetime": new Date(), "likenum": NumberInt(10), "state": null })
- 关键要点:
- 集合不存在时自动隐式创建。
- 数字默认是 double 类型,存整型需用
NumberInt(整型值)。 - 插入当前日期用
new Date()。 - 未指定
_id时,MongoDB 自动生成主键。 - 字段无值可设为
null,或直接省略该字段。
2. 批量文档插入
- 语法:
db.collection.insertMany([<文档1>, <文档2>, ...], {writeConcern: <配置>, ordered: <布尔值>}) - 示例(批量插入多条评论):
db.comment.insertMany([ {"_id": "1", "articleid": "100001", "content": "健康很重要,一杯温水幸福你我他", "userid": "1002", "nickname": "相忘于江湖", "createdatetime": new Date("2019-08-05T22:08:15.522Z"), "likenum": NumberInt(1000), "state": "1"}, {"_id": "2", "articleid": "100001", "content": "我夏天空腹喝凉开水,冬天喝温开水", "userid": "1005", "nickname": "伊人憔悴", "createdatetime": new Date("2019-08-05T23:58:51.485Z"), "likenum": NumberInt(888), "state": "1"} ])
3. 文档命名与格式注意事项
- 键 / 值对有序,区分类型和大小写。
- 文档不能有重复键,键为 UTF-8 字符串。
- 键命名规范:不含 \0,
.和$需特殊场景使用,下划线_开头的键为保留键(非强制)。