在Windows上安装和使用MongoDB并不复杂,下面我将为你梳理一份清晰的安装指南,并介绍一些基本使用方法。为了让你快速了解MongoDB并完成安装,我先用一个简表汇总其核心信息和安装方式。
| 特性/方面 | MongoDB 简介 |
|---|---|
| 数据库类型 | 开源的 NoSQL 文档数据库 |
| 核心特点 | 面向文档存储、模式自由、支持高性能、高可用性(如复制集)和高可扩展性(如分片) |
| 数据格式 | 使用类似 JSON 的 BSON(二进制 JSON)格式存储数据,支持嵌套对象和数组 |
| 与SQL概念对比 | 数据库(Database) → 数据库,集合(Collection) → 表(Table),文档(Document) → 行(Row) |
| 基本操作 (CRUD) | 插入:insertOne(), insertMany()查询: find()更新: updateOne(), updateMany()删除: deleteOne(), deleteMany() |
📥 安装MongoDB
安装前准备
-
下载安装包
访问MongoDB官网的下载中心,选择适合你系统的Windows版本。通常建议选择稳定版(版本号中的y为偶数,例如4.0.x)。务必根据你的系统选择64位版本,因为32位版本有2GB的数据存储限制。 -
创建目录
安装前,建议手动创建用于存放数据库数据和日志的目录,这有助于后续管理。例如:text
D:\MongoDB\data\db # 用于存放数据库文件:cite[1]:cite[3] D:\MongoDB\data\log # 用于存放日志文件:cite[1]
开始安装
你有两种主要的安装方式可选:
-
运行MSI安装程序(新手推荐)
-
双击下载的
.msi文件,按向导步骤安装。 -
在选择安装类型时,可以点击 "Custom" 按钮来自定义安装路径。
-
在最后一步,强烈建议取消勾选 "Install MongoDB Compass",这是一个图形化管理工具,虽然有用但单独安装速度更快,可以后续按需安装。
-
-
解压ZIP压缩包(灵活)
-
将下载的ZIP包解压到你选择的目录,例如
C:\mongodb\或D:\MongoDB\。 -
将此目录下的
bin文件夹路径(例如D:\MongoDB\bin)添加到系统的PATH环境变量中。这样你就可以在任意位置直接运行mongod和mongo命令。
-
🛠 配置与启动服务
安装好MongoDB后,你需要启动数据库服务。以下是几种常见的方式:
| 启动方式 | 说明 | 主要命令(需管理员权限) |
|---|---|---|
| 直接启动 | 临时启动,关闭窗口服务即停止。 | mongod --dbpath D:\MongoDB\data\db |
| 配置文件启动 | 推荐,可统一管理配置。需先创建.conf文件。 | mongod -f D:\MongoDB\mongod.conf |
| 安装为Windows服务 | 最方便,服务在后台运行,可开机自启。 | mongod --install --config "D:\MongoDB\mongod.cfg" --serviceName "MongoDB" |
配置文件示例 (mongod.cfg):
yaml
systemLog:
destination: file
path: D:\MongoDB\data\log\mongod.log # 日志文件路径
storage:
dbPath: D:\MongoDB\data\db # 数据文件路径
net:
bindIp: 127.0.0.1 # 绑定IP,默认本地
port: 27017 # 端口,默认27017
-
安装并启动Windows服务:在以管理员身份运行的命令提示符中,执行上述安装服务的命令。安装成功后,使用
net start MongoDB启动服务,使用net stop MongoDB停止服务。
🔍 连接数据库与基本操作
服务成功启动后,你就可以开始使用MongoDB了。
-
连接MongoDB
打开一个新的命令提示符窗口,输入mongo命令。这会启动MongoDB Shell并连接到本机运行的MongoDB服务(默认地址是localhost:27017)。 -
基本CRUD操作
成功连接后,你就可以在Shell中执行JavaScript命令来操作数据库了。以下是一些最基础的操作示例:javascript
// 查看所有数据库 show dbs // 切换/创建数据库。如果数据库不存在,则创建并切换到此数据库 use mydb // 插入文档(行) db.users.insertOne({name: "张三", age: 30, city: "北京"}) db.users.insertMany([{name: "李四", age: 25}, {name: "王五", age: 28}]) // 查询文档 db.users.find() // 查询所有 db.users.find({name: "张三"}) // 条件查询 // 更新文档 db.users.updateOne({name: "张三"}, {$set: {age: 31}}) db.users.updateMany({age: {$gt: 25}}, {$set: {category: "资深"}}) // 删除文档 db.users.deleteOne({name: "李四"}) db.users.deleteMany({age: {$lt: 20}})
🔒 设置用户认证(重要)
为了安全,务必为数据库设置用户和密码。
-
创建管理员用户
首先,在不开启认证的情况下启动MongoDB服务。然后连接Shell,在admin数据库中创建最高权限用户:javascript
use admin db.createUser({ user: "admin", pwd: "YourStrongPasswordHere", // 请设置一个强密码 roles: [ { role: "root", db: "admin" } ] }) -
启用认证
创建用户后,需要编辑MongoDB配置文件 (mongod.cfg),在systemLog部分后添加安全配置:yaml
security: authorization: enabled然后重启MongoDB服务。重启后,再连接Shell时,你需要先认证才能执行操作:
javascript
use admin db.auth("admin", "YourStrongPasswordHere") // 返回1表示成功
🛠 常见问题与解决
-
服务启动失败
-
权限不足:请务必以管理员身份运行命令提示符。
-
路径错误:检查数据目录
dbpath和日志路径logpath是否存在,并且路径描述正确(例如,避免多余的"")。 -
端口占用:默认端口27017被其他程序占用,可以尝试更改端口或关闭占用程序。
-
-
"mongod" 不是内部或外部命令
这通常是因为环境变量未正确设置。请确保已将MongoDB的bin目录路径添加到系统的PATH变量中,或者你当前就在bin目录下执行命令(此时需要在命令前加.\,例如.\mongod)。
MongoDB 查询
我们讨论的是MongoDB的查询操作。MongoDB的查询使用find方法,它非常灵活,可以接受多个参数来过滤和投影结果。以下是一些常见的查询操作和示例。
基本查询
-
查询所有文档
javascript
db.collection.find()
-
条件查询
javascript
// 等于条件 db.collection.find({ name: "张三" }) // 比较操作符 db.collection.find({ age: { $gt: 25 } }) // 大于 db.collection.find({ age: { $gte: 25 } }) // 大于等于 db.collection.find({ age: { $lt: 30 } }) // 小于 db.collection.find({ age: { $lte: 30 } }) // 小于等于 db.collection.find({ age: { $ne: 25 } }) // 不等于 // 多个条件 db.collection.find({ name: "张三", age: 30 }) // 并且关系 db.collection.find({ $or: [{ name: "张三" }, { age: 25 }] }) // 或者关系 -
投影(选择返回的字段)
javascript
db.collection.find({}, { name: 1, age: 1 }) // 只返回name和age字段,_id默认返回 db.collection.find({}, { name: 1, age: 1, _id: 0 }) // 不返回_id字段 -
限制返回数量
javascript
db.collection.find().limit(10) // 返回前10条
-
排序
javascript
db.collection.find().sort({ age: 1 }) // 按age升序 db.collection.find().sort({ age: -1 }) // 按age降序 -
跳过文档
javascript
db.collection.find().skip(10) // 跳过前10条
-
分页查询
javascript
db.collection.find().skip(10).limit(10) // 跳过10条,取10条,即第11-20条
高级查询
-
正则表达式(模糊查询)
javascript
db.collection.find({ name: /张/ }) // 包含“张”的名字 db.collection.find({ name: /^张/ }) // 以“张”开头的名字 -
数组查询
javascript
// 查询数组包含某个元素 db.collection.find({ tags: "mongodb" }) // 使用$all匹配多个元素 db.collection.find({ tags: { $all: ["mongodb", "database"] } }) // 使用$size匹配数组长度 db.collection.find({ tags: { $size: 3 } }) // 使用$elemMatch匹配数组中的元素满足多个条件 db.collection.find({ scores: { $elemMatch: { $gt: 80, $lt: 90 } } }) -
嵌套文档查询
javascript
// 精确匹配嵌套文档 db.collection.find({ "address.city": "北京" }) // 使用点号查询嵌套文档的字段 db.collection.find({ "address.city": "北京", "address.street": "长安街" }) -
存在性查询
javascript
db.collection.find({ age: { $exists: true } }) // 存在age字段 db.collection.find({ age: { $exists: false } }) // 不存在age字段 -
类型查询
javascript
db.collection.find({ age: { $type: "number" } }) // age字段为数字类型 -
取模查询
javascript
db.collection.find({ age: { $mod: [5, 0] } }) // age字段除以5余0,即5的倍数
聚合查询
MongoDB的聚合管道(aggregation pipeline)可以用于复杂的数据处理和分析。
-
基本聚合
javascript
db.collection.aggregate([ { $match: { age: { $gt: 25 } } }, // 过滤 { $group: { _id: "$city", total: { $sum: 1 } } }, // 按城市分组并计数 { $sort: { total: -1 } } // 按总数降序排序 ]) -
更多聚合阶段
-
$project:重命名、增加或删除字段,类似投影。 -
$unwind:将数组字段拆分为多个文档。 -
$lookup:左连接,从另一个集合中查询数据。
-
索引
为了提升查询性能,可以在经常查询的字段上创建索引。
-
创建索引
javascript
db.collection.createIndex({ name: 1 }) // 在name字段上创建升序索引 db.collection.createIndex({ age: -1 }) // 在age字段上创建降序索引 db.collection.createIndex({ name: 1, age: -1 }) // 复合索引 -
查看索引
javascript
db.collection.getIndexes()
-
删除索引
javascript
db.collection.dropIndex("index_name")
性能分析
可以使用explain方法来分析查询的性能。
javascript
db.collection.find({ name: "张三" }).explain("executionStats")
以上是MongoDB查询的一些常见操作和示例。根据具体需求,可以组合使用这些操作来完成复杂的查询任务。
MongoDB的查询功能非常丰富和灵活。下面我将详细介绍MongoDB的各种查询操作,从基础到高级,并提供实际示例。
📋 基础查询操作
1. 环境准备
首先连接到MongoDB并准备测试数据:
javascript
// 切换到测试数据库
use testdb
// 插入示例数据
db.users.insertMany([
{ name: "张三", age: 25, city: "北京", salary: 5000, skills: ["JavaScript", "MongoDB"], status: "active" },
{ name: "李四", age: 30, city: "上海", salary: 8000, skills: ["Python", "MySQL"], status: "active" },
{ name: "王五", age: 28, city: "北京", salary: 7000, skills: ["Java", "MongoDB"], status: "inactive" },
{ name: "赵六", age: 35, city: "广州", salary: 12000, skills: ["JavaScript", "React"], status: "active" },
{ name: "孙七", age: 22, city: "上海", salary: 4000, skills: ["Vue", "Node.js"], status: "active" }
])
2. 基本查询方法
查询所有文档
javascript
// 查询集合中的所有文档 db.users.find() // 格式化显示结果 db.users.find().pretty()
条件查询
javascript
// 等值查询
db.users.find({ city: "北京" })
// 多条件AND查询
db.users.find({
city: "北京",
status: "active"
})
// 显式AND查询
db.users.find({
$and: [
{ city: "北京" },
{ age: { $gt: 20 } }
]
})
选择返回字段(投影)
javascript
// 只返回name和age字段,_id默认返回
db.users.find({}, { name: 1, age: 1 })
// 排除某些字段
db.users.find({}, { skills: 0, status: 0 })
// 显式排除_id字段
db.users.find(
{ city: "北京" },
{ name: 1, age: 1, city: 1, _id: 0 }
)
🔍 查询操作符详解
比较操作符
javascript
// 大于
db.users.find({ age: { $gt: 25 } })
// 大于等于
db.users.find({ age: { $gte: 25 } })
// 小于
db.users.find({ age: { $lt: 30 } })
// 小于等于
db.users.find({ age: { $lte: 30 } })
// 不等于
db.users.find({ status: { $ne: "inactive" } })
// 在范围内
db.users.find({ age: { $in: [25, 30, 35] } })
// 不在范围内
db.users.find({ city: { $nin: ["北京", "上海"] } })
逻辑操作符
javascript
// OR查询
db.users.find({
$or: [
{ city: "北京" },
{ city: "上海" }
]
})
// NOT查询
db.users.find({
$not: { age: { $lt: 30 } }
})
// NOR查询(都不满足)
db.users.find({
$nor: [
{ city: "北京" },
{ status: "inactive" }
]
})
元素操作符
javascript
// 字段存在检查
db.users.find({ salary: { $exists: true } })
// 类型检查
db.users.find({ age: { $type: "number" } })
📊 数组查询
基本数组操作
javascript
// 精确匹配数组
db.users.find({ skills: ["JavaScript", "MongoDB"] })
// 包含某个元素
db.users.find({ skills: "MongoDB" })
// 包含所有指定元素
db.users.find({ skills: { $all: ["JavaScript", "React"] } })
// 数组大小
db.users.find({ skills: { $size: 2 } })
// 按索引查询
db.users.find({ "skills.0": "JavaScript" })
数组元素匹配
javascript
// 使用$elemMatch进行复杂条件匹配
db.users.find({
skills: {
$elemMatch: {
$regex: /^J/ // 以J开头的技能
}
}
})
🔤 正则表达式查询
javascript
// 基本正则查询
db.users.find({ name: /张/ })
// 以特定字符开头
db.users.find({ name: /^张/ })
// 以特定字符结尾
db.users.find({ name: /三$/ })
// 不区分大小写
db.users.find({ name: /zhang/i })
// 使用$regex操作符
db.users.find({
name: {
$regex: "李",
$options: "i"
}
})
🎯 高级查询技巧
嵌套文档查询
javascript
// 插入包含嵌套文档的数据
db.employees.insertMany([
{
name: "张三",
contact: {
email: "zhangsan@email.com",
phone: "13800138000",
address: {
city: "北京",
street: "朝阳路"
}
}
},
{
name: "李四",
contact: {
email: "lisi@email.com",
phone: "13900139000",
address: {
city: "上海",
street: "南京路"
}
}
}
])
// 查询嵌套字段
db.employees.find({ "contact.address.city": "北京" })
// 嵌套文档精确匹配
db.employees.find({
"contact": {
email: "zhangsan@email.com",
phone: "13800138000"
}
})
分页和排序
javascript
// 排序
db.users.find().sort({ age: 1 }) // 升序
db.users.find().sort({ age: -1 }) // 降序
db.users.find().sort({ age: 1, salary: -1 }) // 多字段排序
// 分页
db.users.find()
.sort({ age: -1 })
.skip(2) // 跳过前2条
.limit(3) // 返回3条
// 计数
db.users.find({ city: "北京" }).count()
// 去重
db.users.distinct("city")
📈 聚合查询
基本聚合操作
javascript
// 分组统计
db.users.aggregate([
{
$group: {
_id: "$city",
totalUsers: { $sum: 1 },
averageAge: { $avg: "$age" },
maxSalary: { $max: "$salary" },
minSalary: { $min: "$salary" }
}
}
])
// 多阶段聚合
db.users.aggregate([
// 第一阶段:过滤
{ $match: { status: "active" } },
// 第二阶段:按城市分组
{ $group: {
_id: "$city",
count: { $sum: 1 },
avgSalary: { $avg: "$salary" }
}},
// 第三阶段:排序
{ $sort: { count: -1 } },
// 第四阶段:限制结果数量
{ $limit: 5 }
])
复杂聚合示例
javascript
// 统计每个城市的技能分布
db.users.aggregate([
// 展开数组
{ $unwind: "$skills" },
// 按城市和技能分组
{ $group: {
_id: {
city: "$city",
skill: "$skills"
},
userCount: { $sum: 1 },
averageAge: { $avg: "$age" }
}},
// 按城市分组,收集技能统计
{ $group: {
_id: "$_id.city",
skills: {
$push: {
skill: "$_id.skill",
count: "$userCount",
avgAge: "$averageAge"
}
},
totalUsers: { $sum: "$userCount" }
}},
// 排序
{ $sort: { totalUsers: -1 } }
])
⚡ 性能优化技巧
索引使用
javascript
// 创建索引
db.users.createIndex({ city: 1 })
db.users.createIndex({ age: 1, status: 1 }) // 复合索引
db.users.createIndex({ name: "text" }) // 文本索引
// 查看索引
db.users.getIndexes()
// 查询分析
db.users.find({ city: "北京" }).explain("executionStats")
查询优化建议
javascript
// 好的实践:使用投影限制返回字段
db.users.find(
{ city: "北京" },
{ name: 1, age: 1, _id: 0 }
)
// 好的实践:合理使用排序和限制
db.users.find({ status: "active" })
.sort({ salary: -1 })
.limit(10)
// 避免:返回大量数据
db.users.find() // 可能返回过多数据
// 避免:无索引的排序
db.users.find().sort({ name: 1 }) // 如果name没有索引,性能可能很差
🛠️ 实用查询模式
范围查询组合
javascript
// 年龄在25-30之间,薪资大于6000
db.users.find({
age: { $gte: 25, $lte: 30 },
salary: { $gt: 6000 }
})
// 特定城市或特定状态
db.users.find({
$or: [
{ city: { $in: ["北京", "上海"] } },
{ status: "active", age: { $lt: 30 } }
]
})
存在性检查
javascript
// 查询有薪资信息的用户
db.users.find({
salary: { $exists: true, $ne: null }
})
// 查询没有电话号码的用户
db.users.find({
phone: { $exists: false }
})
数组长度查询
javascript
// 技能数量大于等于2的用户
db.users.find({
$expr: {
$gte: [{ $size: "$skills" }, 2]
}
})
这些查询示例覆盖了MongoDB的大部分常用查询场景。实际使用时,建议:
-
合理使用索引提高查询性能
-
使用投影减少网络传输数据量
-
分析查询性能使用
explain()方法 -
根据数据特点选择合适的查询操作符
663

被折叠的 条评论
为什么被折叠?



