GKLBB

当你经历了暴风雨,你也就成为了暴风雨

导航

软件开发 --- 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 的特点让它在需要高灵活性、高并发和复杂查询的场景中非常适用。

 

posted on 2024-12-09 06:26  GKLBB  阅读(13)  评论(0编辑  收藏  举报