Skip to content

MongoDB 数据库 ​

MongoDB 是一个 NoSQL 文档型数据库,数据以 BSON(类 JSON)格式存储。

基本概念 ​

数据库(database)→ 集合(collection)→ 文档(document)
数据库(database)→ 集合(collection)→ 文档(document)
  • 数据库和集合会在创建文档时自动创建
  • 每个文档都有一个 _id 作为唯一标识(自动生成)
  • MongoDB 底层使用 JavaScript 引擎,支持 ES 语法

基本操作 ​

连接 ​

bash
mongod                              # 启动数据库服务(默认端口 27017)
mongo                               # 连接数据库
mongod --dbpath=c:/data/db          # 指定数据目录
mongod                              # 启动数据库服务(默认端口 27017)
mongo                               # 连接数据库
mongod --dbpath=c:/data/db          # 指定数据目录

数据库命令 ​

bash
show dbs                            # 查看所有数据库
use demo                            # 使用/创建数据库
db                                  # 当前数据库
show collections                    # 显示当前数据库的集合
show dbs                            # 查看所有数据库
use demo                            # 使用/创建数据库
db                                  # 当前数据库
show collections                    # 显示当前数据库的集合

CRUD 操作 ​

插入 ​

bash
db.users.insert({ name: '张三', age: 18 })
db.users.insertMany([{ name: '李四' }, { name: '王五' }])
db.users.insert({ name: '张三', age: 18 })
db.users.insertMany([{ name: '李四' }, { name: '王五' }])

查询 ​

bash
db.users.find()                              # 查询全部
db.users.find({ name: '张三' })               # 条件查询
db.users.find({}, { name: 1, _id: 0 })       # 只显示 name 字段
db.users.find({ age: { $gt: 18 } })          # 大于
db.users.find({ age: { $lt: 18 } })          # 小于
db.users.find({ age: { $in: [18, 20] } })    # 包含
db.users.find({ $or: [{ age: 18 }, { name: '张三' }] })  # 或
db.users.find().limit(5)                     # 限制条数
db.users.find().skip(5)                      # 跳过(分页用)
db.users.find().sort({ age: -1 })            # 排序(-1 倒序,1 升序)
db.users.find().count()                      # 返回条数
db.users.find()                              # 查询全部
db.users.find({ name: '张三' })               # 条件查询
db.users.find({}, { name: 1, _id: 0 })       # 只显示 name 字段
db.users.find({ age: { $gt: 18 } })          # 大于
db.users.find({ age: { $lt: 18 } })          # 小于
db.users.find({ age: { $in: [18, 20] } })    # 包含
db.users.find({ $or: [{ age: 18 }, { name: '张三' }] })  # 或
db.users.find().limit(5)                     # 限制条数
db.users.find().skip(5)                      # 跳过(分页用)
db.users.find().sort({ age: -1 })            # 排序(-1 倒序,1 升序)
db.users.find().count()                      # 返回条数

修改 ​

bash
db.users.update({ name: '张三' }, { $set: { age: 20 } })
db.users.updateOne({ name: '张三' }, { $set: { age: 20 } })
db.users.updateMany({}, { $set: { status: 1 } })
db.users.update({ name: '张三' }, { $unset: { age: '' } })  # 移除字段
db.users.update({ name: '张三' }, { $set: { age: 20 } })
db.users.updateOne({ name: '张三' }, { $set: { age: 20 } })
db.users.updateMany({}, { $set: { status: 1 } })
db.users.update({ name: '张三' }, { $unset: { age: '' } })  # 移除字段

删除 ​

bash
db.users.remove({ name: '张三' })    # 物理删除
db.users.drop()                      # 删除集合
db.users.remove({ name: '张三' })    # 物理删除
db.users.drop()                      # 删除集合

逻辑删除:定义一个字段(如 isDelete),通过 update 修改状态值,而非真正删除。

索引与优化 ​

bash
# 批量插入时,先组装数组再插入(避免循环单条插入)
let arr = []
for (let i = 0; i < 30000; i++) {
  arr.push({ x: i })
}
db.users.insert(arr)
# 批量插入时,先组装数组再插入(避免循环单条插入)
let arr = []
for (let i = 0; i < 30000; i++) {
  arr.push({ x: i })
}
db.users.insert(arr)

Mongoose ​

Mongoose 是 MongoDB 的 ODM(对象文档映射)库。

bash
npm install mongoose
npm install mongoose

连接数据库 ​

js
const mongoose = require('mongoose')

mongoose.connect('mongodb://localhost:27017/test', {
  useNewUrlParser: true
})
const mongoose = require('mongoose')

mongoose.connect('mongodb://localhost:27017/test', {
  useNewUrlParser: true
})

定义 Schema 和 Model ​

js
const Schema = mongoose.Schema

const userSchema = new Schema({
  uname: String,
  age: Number,
  sex: { type: String, default: '男' }
})

const User = mongoose.model('User', userSchema)
const Schema = mongoose.Schema

const userSchema = new Schema({
  uname: String,
  age: Number,
  sex: { type: String, default: '男' }
})

const User = mongoose.model('User', userSchema)

CRUD ​

js
// 创建
User.create({ uname: 'hny', age: 18 }, (err) => {
  if (!err) console.log('创建成功')
})

// 查询
User.find({ uname: /hny/ }, 'name -_id', { skip: 5 }, (err, docs) => {
  console.log(docs)
})

// 不传回调返回 Query 对象,支持链式调用
User.find({ uname: 'hny' })
  .skip(5)
  .limit(10)
  .exec()
  .then(docs => console.log(docs))

// 修改
User.updateOne({ uname: 'hny' }, { age: 20 })
User.updateMany({}, { status: 1 })

// 删除
User.deleteOne({ uname: 'hny' })
User.deleteMany({ age: { $lt: 18 } })

// 通过 ID 修改
User.findByIdAndUpdate('id', { age: 20 }, { new: true })

// 查询条数
User.countDocuments({ uname: 'hny' }, (err, count) => {})
// 创建
User.create({ uname: 'hny', age: 18 }, (err) => {
  if (!err) console.log('创建成功')
})

// 查询
User.find({ uname: /hny/ }, 'name -_id', { skip: 5 }, (err, docs) => {
  console.log(docs)
})

// 不传回调返回 Query 对象,支持链式调用
User.find({ uname: 'hny' })
  .skip(5)
  .limit(10)
  .exec()
  .then(docs => console.log(docs))

// 修改
User.updateOne({ uname: 'hny' }, { age: 20 })
User.updateMany({}, { status: 1 })

// 删除
User.deleteOne({ uname: 'hny' })
User.deleteMany({ age: { $lt: 18 } })

// 通过 ID 修改
User.findByIdAndUpdate('id', { age: 20 }, { new: true })

// 查询条数
User.countDocuments({ uname: 'hny' }, (err, count) => {})

文档操作 ​

js
// 创建文档并保存
const user = new User({ uname: 'hny', age: 18 })
user.save()

// 查询后直接修改
User.find({}, (err, docs) => {
  docs[0].uname = 'lishi'
  docs[0].save()
})

// 转普通对象
const obj = docs[0].toObject()
// 创建文档并保存
const user = new User({ uname: 'hny', age: 18 })
user.save()

// 查询后直接修改
User.find({}, (err, docs) => {
  docs[0].uname = 'lishi'
  docs[0].save()
})

// 转普通对象
const obj = docs[0].toObject()

数据库备份 ​

bash
# 导出
mongodump -d myblog -o c:/data/dbs

# 导入(--drop 先删除再恢复)
mongorestore -d myblog --drop c:/data/dbs

# 导出表
mongoexport -d demo -c users --csv -f name,age -o c:/data/users.csv

# 导入表
mongoimport -d demo -c users --upsert --drop c:/data/users.dat
# 导出
mongodump -d myblog -o c:/data/dbs

# 导入(--drop 先删除再恢复)
mongorestore -d myblog --drop c:/data/dbs

# 导出表
mongoexport -d demo -c users --csv -f name,age -o c:/data/users.csv

# 导入表
mongoimport -d demo -c users --upsert --drop c:/data/users.dat