数据库与集合操作

数据库操作

 # 查看默认数据库(显示安装后默认样子)
 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)

关键提醒:不带 $setupdate全量替换,会把其他字段全部删掉!务必记住。

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()