软件开发 --- MongoDB 之初体验
一种JSON 格式存储文档的数据库
和mysql这样的数据库比最大的区别是,字段随意扩展并直接包含逻辑关系,免去关联表。
安装
windows安装
1.访问 https://www.mongodb.com/try/download/community,选择适合 Windows 的版本,通常选择 MSI
安装包格式。下载并运行安装程序。
在安装过程中,选择“Complete”安装类型以安装所有默认功能。
选择安装路径,建议使用默认路径,通常为 C:\Program Files\MongoDB\Server\<version>\
。在安装过程中,会提示是否设置 MongoDB 为 Windows 服务。
可以选择 Install MongoDB as a Service(将 MongoDB 安装为 Windows 服务),这样 MongoDB 会自动启动并在系统启动时运行。
2.配置MongoDB数据库环境
找到安装好MongoDB的bin路径 复制bin路径
打开此电脑 -> 打开高级系统设置 -> 环境变量 -> 找到path,点击新建。粘贴路径 点击确定保存
3.运行MongoDB
找到MongoDB安装地址 在data目录下创建db文件夹,复制db文件夹路径
window+R输入cmd打开命令窗口 输入以下命令
mongod --dbpath 复制过来的db文件夹路径
启动之后可以在浏览器访问以下地址 http://localhost:27017
4.使用navicat测试连接
linux安装
更新系统软件包: sudo apt update 安装 MongoDB 公共 GPG 密钥: wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add - 添加 MongoDB 官方软件源: echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list 更新软件源: sudo apt update 安装 MongoDB: sudo apt install -y mongodb-org 启动 MongoDB: sudo systemctl start mongod 检查 MongoDB 服务状态: sudo systemctl status mongod 设置 MongoDB 开机自启: sudo systemctl enable mongod 连接到 MongoDB: mongo
方法 2:从源码安装 MongoDB(适用于 Linux)
sudo apt install -y build-essential libssl-dev libboost-filesystem-dev libboost-program-options-dev wget https://fastdl.mongodb.org/src/mongodb-src-r6.0.0.tar.gz tar -zxvf mongodb-src-r6.0.0.tar.gz cd mongodb-src-r6.0.0 mkdir build cd build cmake .. make sudo make install ./bin/mongod 连接 MongoDB: ./bin/mongo
1. 用户数据存储
MongoDB 常用于存储用户信息,特别适合数据字段不固定的场景。
例子: 假设我们需要存储用户信息,包括名字、年龄、邮箱等:
插入用户数据:
db.users.insertOne({ "name": "Alice", "age": 25, "email": "alice@example.com", "hobbies": ["reading", "traveling"] })
MongoDB 使用 JSON 格式存储数据,字段可以灵活增加,比如这里包含了一个数组字段 hobbies。
查询用户数据:
db.users.find({ "name": "Alice" }) 返回: { "_id": "63e2b96f1c4d1", "name": "Alice", "age": 25, "email": "alice@example.com", "hobbies": ["reading", "traveling"] }
优势: MongoDB 的文档结构非常灵活,如果有新字段,比如“用户地址”,可以直接插入而无需更改数据库结构。
2. 实现动态数据结构
MongoDB 非常适合存储复杂、动态的数据结构。
例子: 假设一个电商系统需要存储订单信息,不同订单可能包含不同的字段:
插入订单数据:
db.orders.insertMany([ { "order_id": 1001, "customer": "John", "items": [ { "product": "Laptop", "quantity": 1 }, { "product": "Mouse", "quantity": 2 } ], "total": 1200 }, { "order_id": 1002, "customer": "Jane", "items": [ { "product": "Phone", "quantity": 1 } ], "total": 800, "discount": 50 } ])
查询订单数据: 查询所有包含“Laptop”的订单:
db.orders.find({ "items.product": "Laptop" }) 返回: { "order_id": 1001, "customer": "John", "items": [ { "product": "Laptop", "quantity": 1 }, { "product": "Mouse", "quantity": 2 } ], "total": 1200 }
优势:
每个文档的字段可以不同,灵活应对复杂的数据结构。
嵌套文档(如 items)可以直接存储关联信息,无需额外的表。
3. 日志存储与分析
MongoDB 非常适合存储日志信息,方便快速查询和分析。
例子: 假设我们记录用户访问日志:
插入日志数据:
db.logs.insertOne({ "timestamp": new Date(), "user_id": "12345", "action": "login", "ip_address": "192.168.1.1" })
查询特定用户的日志:
MongoDB 提供强大的查询能力,可以快速查找特定条件的日志记录。比如,如果我们想查询特定用户(例如用户 ID 为"12345"
)的所有访问日志,并按时间戳降序排列,可以使用以下查询:
db.logs.find({ "user_id": "12345" }).sort({ "timestamp": -1 })
统计用户登录次数:
MongoDB 支持聚合操作,能够高效地对日志数据进行统计和分析。例如,我们可以统计每个用户的登录次数。假设每次用户登录时,action
字段的值为 "login"
,我们可以通过聚合管道(aggregation pipeline)进行统计:
db.logs.aggregate([
{ $match: { "action": "login" } }, // 过滤出所有登录操作的记录
{ $group: { "_id": "$user_id", "login_count": { $sum: 1 } } } // 按 user_id 分组,统计每个用户的登录次数
])
结果: [ { "_id": "12345", "login_count": 10 }, { "_id": "67890", "login_count": 5 } ]
优势:
MongoDB 支持强大的聚合操作,可以快速分析日志数据。
数据存储灵活,字段可以动态扩展,比如日志中添加新字段(如浏览器信息)。
4. 商品推荐系统
MongoDB 的灵活性特别适合构建推荐系统,存储用户喜好和推荐内容。
例子: 假设一个平台需要为用户存储推荐的商品:
插入推荐商品:
db.recommendations.insertOne({ "user_id": "12345", "recommended_products": [ { "product_id": "1001", "score": 0.95 }, { "product_id": "1002", "score": 0.89 } ] })
查询用户推荐: 查询用户 ID 为 12345 的推荐商品:
db.recommendations.find({ "user_id": "12345" }) 结果: { "user_id": "12345", "recommended_products": [ { "product_id": "1001", "score": 0.95 }, { "product_id": "1002", "score": 0.89 } ] }
优势:
嵌套数据结构存储推荐内容,无需额外联表查询。
动态更新推荐列表,支持实时推荐。
5. 地理位置存储与查询
MongoDB 支持地理空间索引,适合存储和查询地理位置数据。
例子: 假设一个外卖平台需要存储商家的位置信息,并查询附近商家:
插入商家位置信息:
db.restaurants.insertMany([ { "name": "Pizza Hut", "location": { "type": "Point", "coordinates": [116.397128, 39.916527] } }, { "name": "KFC", "location": { "type": "Point", "coordinates": [116.404128, 39.915528] } } ])
为了支持高效的地理空间查询,MongoDB 提供了 2dsphere 索引。此索引支持基于球面坐标系统(经纬度坐标)的地理空间查询。我们可以在 location
字段上创建 2dsphere
索引:2dsphere
索引使得 MongoDB 能够高效处理球面上的位置数据,并支持如距离查询、附近查询等操作。
db.restaurants.createIndex({ "location": "2dsphere" })
查询附近商家: 查找距离某点([116.397128, 39.916527])2 公里内的商家:
db.restaurants.find({ "location": { $near: { $geometry: { "type": "Point", "coordinates": [116.397128, 39.916527] }, $maxDistance: 2000 // 距离限制:2000 米(即 2 公里) } } })
$near
:表示进行地理空间查询,查找离指定坐标点最近的文档。$geometry
:指定查询的地理坐标,这里是一个经纬度坐标[116.397128, 39.916527]
。$maxDistance
:限定查询的最大距离,单位是米。比如,设置为2000
表示查询 2 公里内的商家。
结果:
[ { "name": "Pizza Hut", "location": { "type": "Point", "coordinates": [116.397128, 39.916527] } }, { "name": "KFC", "location": { "type": "Point", "coordinates": [116.404128, 39.915528] } } ]
优势:
支持地理位置的高效查询,特别适合外卖、地图等业务场景。
简单的索引和查询语法即可实现复杂的地理计算。
MongoDB 的典型应用场景
1. 灵活数据存储: 用户信息、商品信息、日志、订单等。
2. 实时分析: 实时统计用户行为、销售数据等。
3. 推荐系统: 存储用户喜好和推荐结果。
4. 地理位置服务: 外卖、共享单车、商家分布等场景。
5. 内容管理: 存储文章、评论等动态内容。
MongoDB 的优势
1. 灵活性: 数据结构不固定,方便快速迭代。
2. 高性能: 适合高并发的读写操作。
3. 分布式特性: 天生支持分片,能轻松扩展到大规模数据存储。
4. 强大的查询能力: 支持嵌套文档、聚合查询、地理空间索引等复杂操作。
MongoDB 的特点让它在需要高灵活性、高并发和复杂查询的场景中非常适用。