MongoDB数据库 Window安装以及使用

【投稿赢 iPhone 17】「我的第一个开源项目」故事征集:用代码换C位出道! 10w+人浏览 1.7k人参与

在Windows上安装和使用MongoDB并不复杂,下面我将为你梳理一份清晰的安装指南,并介绍一些基本使用方法。为了让你快速了解MongoDB并完成安装,我先用一个简表汇总其核心信息和安装方式。

特性/方面MongoDB 简介
数据库类型开源的 NoSQL 文档数据库
核心特点面向文档存储、模式自由、支持高性能、高可用性(如复制集)和高可扩展性(如分片)
数据格式使用类似 JSON 的 BSON(二进制 JSON)格式存储数据,支持嵌套对象和数组
与SQL概念对比数据库(Database) → 数据库,集合(Collection) → 表(Table),文档(Document) → 行(Row)
基本操作 (CRUD)插入:insertOne()insertMany()
查询:find()
更新:updateOne()updateMany()
删除:deleteOne()deleteMany()

📥 安装MongoDB

安装前准备
  1. 下载安装包
    访问MongoDB官网的下载中心,选择适合你系统的Windows版本。通常建议选择稳定版(版本号中的y为偶数,例如4.0.x)。务必根据你的系统选择64位版本,因为32位版本有2GB的数据存储限制。

  2. 创建目录
    安装前,建议手动创建用于存放数据库数据和日志的目录,这有助于后续管理。例如:

    text

    D:\MongoDB\data\db    # 用于存放数据库文件:cite[1]:cite[3]
    D:\MongoDB\data\log   # 用于存放日志文件:cite[1]
开始安装

你有两种主要的安装方式可选:

  1. 运行MSI安装程序(新手推荐)

    • 双击下载的 .msi 文件,按向导步骤安装。

    • 在选择安装类型时,可以点击 "Custom" 按钮来自定义安装路径。

    • 在最后一步,强烈建议取消勾选 "Install MongoDB Compass",这是一个图形化管理工具,虽然有用但单独安装速度更快,可以后续按需安装。

  2. 解压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了。

  1. 连接MongoDB
    打开一个新的命令提示符窗口,输入 mongo 命令。这会启动MongoDB Shell并连接到本机运行的MongoDB服务(默认地址是 localhost:27017)。

  2. 基本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}})

🔒 设置用户认证(重要)

为了安全,务必为数据库设置用户和密码

  1. 创建管理员用户
    首先,在不开启认证的情况下启动MongoDB服务。然后连接Shell,在 admin 数据库中创建最高权限用户:

    javascript

    use admin
    db.createUser({
      user: "admin",
      pwd: "YourStrongPasswordHere", // 请设置一个强密码
      roles: [ { role: "root", db: "admin" } ]
    })
  2. 启用认证
    创建用户后,需要编辑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方法,它非常灵活,可以接受多个参数来过滤和投影结果。以下是一些常见的查询操作和示例。

基本查询

  1. 查询所有文档

    javascript

    db.collection.find()
  2. 条件查询

    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 }] }) // 或者关系
  3. 投影(选择返回的字段)

    javascript

    db.collection.find({}, { name: 1, age: 1 }) // 只返回name和age字段,_id默认返回
    db.collection.find({}, { name: 1, age: 1, _id: 0 }) // 不返回_id字段
  4. 限制返回数量

    javascript

    db.collection.find().limit(10) // 返回前10条
  5. 排序

    javascript

    db.collection.find().sort({ age: 1 }) // 按age升序
    db.collection.find().sort({ age: -1 }) // 按age降序
  6. 跳过文档

    javascript

    db.collection.find().skip(10) // 跳过前10条
  7. 分页查询

    javascript

    db.collection.find().skip(10).limit(10) // 跳过10条,取10条,即第11-20条

高级查询

  1. 正则表达式(模糊查询)

    javascript

    db.collection.find({ name: /张/ }) // 包含“张”的名字
    db.collection.find({ name: /^张/ }) // 以“张”开头的名字
  2. 数组查询

    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 } } })
  3. 嵌套文档查询

    javascript

    // 精确匹配嵌套文档
    db.collection.find({ "address.city": "北京" })
    
    // 使用点号查询嵌套文档的字段
    db.collection.find({ "address.city": "北京", "address.street": "长安街" })
  4. 存在性查询

    javascript

    db.collection.find({ age: { $exists: true } }) // 存在age字段
    db.collection.find({ age: { $exists: false } }) // 不存在age字段
  5. 类型查询

    javascript

    db.collection.find({ age: { $type: "number" } }) // age字段为数字类型
  6. 取模查询

    javascript

    db.collection.find({ age: { $mod: [5, 0] } }) // age字段除以5余0,即5的倍数

聚合查询

MongoDB的聚合管道(aggregation pipeline)可以用于复杂的数据处理和分析。

  1. 基本聚合

    javascript

    db.collection.aggregate([
      { $match: { age: { $gt: 25 } } }, // 过滤
      { $group: { _id: "$city", total: { $sum: 1 } } }, // 按城市分组并计数
      { $sort: { total: -1 } } // 按总数降序排序
    ])
  2. 更多聚合阶段

    • $project:重命名、增加或删除字段,类似投影。

    • $unwind:将数组字段拆分为多个文档。

    • $lookup:左连接,从另一个集合中查询数据。

索引

为了提升查询性能,可以在经常查询的字段上创建索引。

  1. 创建索引

    javascript

    db.collection.createIndex({ name: 1 }) // 在name字段上创建升序索引
    db.collection.createIndex({ age: -1 }) // 在age字段上创建降序索引
    db.collection.createIndex({ name: 1, age: -1 }) // 复合索引
  2. 查看索引

    javascript

    db.collection.getIndexes()
  3. 删除索引

    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的大部分常用查询场景。实际使用时,建议:

  1. 合理使用索引提高查询性能

  2. 使用投影减少网络传输数据量

  3. 分析查询性能使用explain()方法

  4. 根据数据特点选择合适的查询操作符

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值