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 mongoosenpm 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
Cao Note