数据库与集合操作
数据库操作
# 查看默认数据库(显示安装后默认样子)
test> show dbs
admin 40.00 KiB
config 60.00 KiB
local 72.00 KiB
# 查看所有数据库
show dbs
// 或
show databases
# 切换 / 创建数据库(没有则自动创建)
use shop
注意:此时 show dbs 还看不到 shop,因为没有数据
# 查看当前所在的数据库
db
# 查看当前库的统计信息(大小、集合数量、索引数量等)
db.stats()
# 查看当前 MongoDB 的所有连接信息
db.currentOp()
3 删除当前数据库(慎用!)
db.dropDatabase()隐式创建的触发条件:仅仅 use shop 并不会真正创建数据库,必须等到向 shop 库中插入至少一条数据后,show dbs 才会显示它。
集合操作
# 查看当前库中所有集合
show collections
// 或
show tables
# 显式创建集合(通常不需要,第一次插入数据时会自动创建)
db.createCollection("users")
# 查看集合的统计信息
db.users.stats()
# 查看集合的数据总大小(字节)
db.users.totalSize()
# 删除集合
db.users.drop()动手验证"隐式创建"
# 切换到一个新库
use mytest
# 此时 show dbs 看不到 mytest
show dbs
// admin, config, local ← 没有 mytest
# 插入一条数据
db.students.insertOne({name: "张三", score: 90})
# 再次查看,mytest 出现了!
show dbs
// admin, config, local, mytest
# students 集合也自动创建了
show collections
// students文档 CRUD 操作
CRUD = Create(增) + Read(查) + Update(改) + Delete(删)。这是数据库最核心的四类操作。
以下演示使用 shop 数据库和 products 集合。
use shop新增数据(Create)
insertOne —— 插入一条
# 插入一条产品数据
db.products.insertOne({
_id: 1,
name: "黄金竹",
price: 99.99,
category: "食品",
stock: 100,
tags: ["热卖", "进口"]
})
# 返回: { acknowledged: true, insertedId: 1 }insertMany —— 插入多条
# 一次性插入多条数据(用数组包裹)
db.products.insertMany([
{ _id: 2, name: "苹果", price: 5.00, category: "水果", stock: 500 },
{ _id: 3, name: "牛奶", price: 8.50, category: "饮品", stock: 200, brand: "蒙牛" },
{ _id: 4, name: "笔记本电脑", price: 5999.00, category: "电子产品", stock: 30 }
])观察第 3 条数据:多了一个
brand字段,其他文档没有这个字段也完全没问题——这就是"无模式"的体现。
insert —— 通用插入
# insert 单条
db.products.insert({ _id: 5, name: "键盘", price: 299.00 })
# insert 多条(用数组包裹)
db.products.insert([
{ _id: 6, name: "鼠标", price: 149.00 },
{ _id: 7, name: "显示器", price: 1999.00 }
])关于
_id:
每条文档都必须有
_id,它是 MongoDB 的主键可以手动指定(如上面用数字 1~7)
不指定则会自动生成
ObjectId("64d5f8a3...")这样的 12 字节唯一标识
查询数据(Read)
基本查询
# 查询集合中所有数据
db.products.find()
# 等值查询:查找 _id 为 1 的产品
db.products.find({ _id: 1 })
# 查找所有"食品"分类的产品
db.products.find({ category: "食品" })格式化输出
# pretty() 让输出更易读(每条文档独占多行)
db.products.find().pretty()返回单条
# findOne 直接返回一个对象,不是游标
db.products.findOne({ category: "饮品" })统计数量
# 统计集合文档总数
db.products.count()
# 统计满足条件的文档数
db.products.count({ category: "食品" })修改数据(Update)
关键提醒:不带
$set的update是全量替换,会把其他字段全部删掉!务必记住。
updateOne —— 修改单条
# 将牛奶的价格改为 9.90
db.products.updateOne(
{ _id: 3 }, // 条件:匹配 _id 为 3 的文档
{ $set: { price: 9.90 } } // 修改:将 price 设为 9.90(只改这一个字段)
)
# 返回: { acknowledged: true, matchedCount: 1, modifiedCount: 1 }updateMany —— 修改多条
# 将所有食品类产品的库存增加 50
db.products.updateMany(
{ category: "食品" },
{ $set: { stock: 150 } }
)$set vs 全量替换
# ❌ 错误示范:不带 $set(全量替换)
db.products.updateOne(
{ _id: 1 },
{ price: 88.88 }
)
# 结果:MongoInvalidArgumentError: Update document requires atomic operators
# MongoDB 3.6+ 直接报错拒绝执行
# ✅ 正确示范:带 $set(局部修改)
db.products.updateOne(
{ _id: 1 },
{ $set: { price: 88.88 } }
)
# 结果:只修改了 price,其他字段保持不变$inc —— 数值增减
# 库存 +10
db.products.updateOne({ _id: 1 }, { $inc: { stock: 10 } })
# 库存 -5
db.products.updateOne({ _id: 1 }, { $inc: { stock: -5 } })$unset —— 删除字段
# 删除牛奶的 brand 字段
db.products.updateOne({ _id: 3 }, { $unset: { brand: "" } })
# 注意: brand 字段的值可以为任意内容("" 或 1 或 "任意"),都会被忽略upsert —— 有则改、无则插
# 查找 _id:8 的产品,找到则修改价格,找不到则插入一条新数据
db.products.updateOne(
{ _id: 8 },
{ $set: { name: "耳机", price: 399.00, category: "电子产品", stock: 50 } },
{ upsert: true }
)
# 注意: 由于 _id:8 不存在,自动插入一条新文档replaceOne —— 整条替换
# 用全新的文档替换旧文档
db.products.replaceOne(
{ _id: 2 },
{ _id: 2, name: "红富士苹果", price: 6.00, category: "水果", stock: 300, origin: "山东" }
)删除数据(Delete)
# deleteOne:删除满足条件的一条
db.products.deleteOne({ _id: 7 })
# deleteMany:删除满足条件的所有文档
db.products.deleteMany({ category: "食品" })
# remove:按条件删除(deleteOne/deleteMany 的前身)
db.products.remove({ _id: 5 })
# 清空整个集合(危险操作!)
db.products.remove({})
remove({})会删除集合中所有文档,但集合本身还在。若要连集合一起删,用db.products.drop()。
原创
MongoDB使用方法
本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
评论交流
欢迎留下你的想法