在 MongoDB 中,所有业务数据都以“文档”(Document)形式存储在集合中。文档结构类似 JSON,支持嵌套、数组和多种数据类型。本文以“文章评论”场景为例,详解文档的插入、查询、更新与删除操作。
一、插入文档
1. 单条插入
使用 insert() 或 insertOne() 插入单个文档:
db.comment.insert({ "articleid": "100000", "content": "今天天气真好,阳光明媚", "userid": "1001", "nickname": "Rose", "createdatetime": new Date(), "likenum": NumberInt(10), "state": null })
关键提示:
- 若
comment集合不存在,MongoDB 会自动创建;- 数字默认为
double类型,整型必须使用NumberInt(值);- 未指定
_id时,系统自动生成唯一ObjectId;- 字段值可为
null,也可直接省略该字段。
2. 批量插入
使用 insertMany() 一次插入多条文档:
db.comment.insertMany([ { "_id": "1", "articleid": "100001", "userid": "1002", "nickname": "相忘于江湖", "likenum": NumberInt(1000), "state": "1" }, { "_id": "2", "articleid": "100001", "userid": "1005", "nickname": "伊人憔悴", "likenum": NumberInt(888), "state": "1" } ])
注意:
- 可手动指定
_id,但必须保证唯一;- 默认按顺序插入,若某条失败,后续文档将不再插入(已成功数据不回滚);
- 生产环境中建议用
try...catch捕获异常。
二、查询文档
1. 查询全部文档
db.comment.find() // 或 db.comment.find({})
2. 条件查询
// 查询 userid 为 "1003" 的所有评论 db.comment.find({userid: "1003"})
3. 查询单条记录
// 返回符合条件的第一条 db.comment.findOne({userid: "1003"})
4. 投影查询(只返回指定字段)
// 只显示 userid 和 nickname(_id 默认包含) db.comment.find({userid: "1003"}, {userid: 1, nickname: 1}) // 不显示 _id db.comment.find({userid: "1003"}, {userid: 1, nickname: 1, _id: 0})
三、更新文档
1. 覆盖更新(慎用!)
db.comment.update({_id: "1"}, {likenum: NumberInt(1001)})
⚠️ 此操作会替换整个文档,仅保留 likenum 字段,其他字段全部丢失!
2. 局部更新(推荐)
使用 $set 修改指定字段,保留其余内容:
db.comment.update({_id: "2"}, {$set: {likenum: NumberInt(889)}})
3. 批量更新
默认只更新第一条匹配文档,需加 {multi: true} 更新全部:
// 仅更新第一条 db.comment.update({userid: "1003"}, {$set: {nickname: "凯撒"}}) // 更新所有匹配项 db.comment.update( {userid: "1003"}, {$set: {nickname: "凯撒大帝"}}, {multi: true} )
4. 数值递增/递减
使用 $inc 对数值字段进行原子增减:
// 点赞数 +1 db.comment.update({_id: "3"}, {$inc: {likenum: NumberInt(1)}})
四、删除文档
1. 删除指定文档
db.comment.remove({_id: "1"})
2. 删除所有文档(极其危险!)
db.comment.remove({})
💡 提示:
remove()在新版本中已逐步被deleteOne()和deleteMany()替代,但旧语法仍广泛兼容。
掌握这些 CRUD 操作,就能高效地管理 MongoDB 中的业务数据,为构建动态应用打下坚实基础。