- A+
MongoDB是一个高性能、可扩展的NoSQL文档型数据库,由C语言编写,适用于大数据量和灵活数据结构的Web应用。它以类似JSON的文档形式存储数据,通过集合组织文档,每个文档由键值对组成,支持嵌套和数组。MongoDB的设计满足高性能和灵活性需求,是当前热门的分布式数据存储解决方案。
主要特点
文档型存储:数据以 BSON(一种类似JSON的二进制格式)文档形式存储,每个文档可以有不同的字段和结构;
无模式:MongoDB是模式自由的,不需要预先定义数据结构,可以随时添加或修改字段;
高性能:支持快速读写操作,特别是对于大数据量的处理;
可扩展性:易于扩展,支持分片(Sharding)和复制集(Replica Sets),可以水平扩展数据;
索引支持:支持多种索引类型,包括全文索引,以提高查询性能。
强大的查询语言:支持丰富的查询操作,包括条件查询、范围查询、正则表达式等;
聚合框架:提供强大的数据处理能力,支持数据聚合、分组、排序等操作;
高可用性:通过复制集实现数据冗余和自动故障转移,保证服务的高可用性;
易于集成:支持多种编程语言和驱动,易于与各种应用程序集成;
地理空间支持:支持地理空间索引和查询,适用于地理位置相关的应用;
事务支持:从4.0版本开始,MongoDB引入了多文档事务支持,提高了数据一致性;
灵活的存储引擎:支持多种存储引擎,如WiredTiger和In-Memory,以满足不同场景的需求。应用场景
物流行业:存储订单信息,跟踪订单状态更新,通过内嵌数组形式高效管理订单变更;
内容管理系统(CMS):存储和管理文章、图片、视频等多样内容,适应内容结构的变化;
社交网络应用:管理用户信息、社交关系和消息数据,实现实时互动和高效数据读写;
物联网(IoT)应用:存储和处理来自物联网设备的传感器数据、设备状态等,支持实时监控与告警;
实时推荐系统:分析用户行为数据,实现个性化的实时推荐功能。
安装MongoDB
修改内核参数
vim /etc/sysctl.conf
vm.max_map_count = 262144 //保存退出
sysctl -p
设置所有用户最大进程数和最大文件句柄数
vim /etc/security/limits.conf //永久修改
* soft nproc 65535
* hard nproc 65535
* soft nofile 81920
* hard nofile 81920
ulimit -u 65535; ulimit -Hu 65535; ulimit -n 81920; ulimit -Hn 81920 //临时修改
命令解释
ulimit -u 65535 # 设置最大进程数(软限制)ulimit -u 查看最大进程数(软限制)
ulimit -Hu 65535 # 设置最大进程数(硬限制)ulimit -Hu 查看最大进程数(硬限制)
ulimit -n 81920 # 设置最大文件句柄数(软限制)ulimit -n 查看最大文件句柄数(软限制)
ulimit -Hn 81920 # 设置最大文件句柄数(硬限制)ulimit -Hn 查看最大文件句柄数(硬限制)
安装MongoDB依赖
yum -y install libcurl openssl xz-libs
下载MongoDB包
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-7.0.14.tgz
解压安装MongoDB
tar xvf mongodb-linux-x86_64-rhel70-7.0.14.tgz
mv mongodb-linux-x86_64-rhel70-7.0.14 /usr/local/mongodb-7.0.14
ln -s /usr/local/mongodb-7.0.14/ /usr/local/mongodb
mkdir -p /usr/local/mongodb/etc
vim /usr/local/mongodb/etc/mongod.conf
systemLog:
destination: file # 日志输出到文件
logAppend: true # 日志以追加方式写入
quiet: true # 减少输出信息
path: /usr/local/mongodb/logs/mongodb.log # 日志文件路径
storage:
dbPath: /data/mongodb # 数据存储目录
processManagement:
fork: true # 以守护进程方式运行
pidFilePath: /usr/local/mongodb/logs/mongod.pid # 进程ID文件路径
timeZoneInfo: /usr/share/zoneinfo # 时区信息路径
net:
port: 27017 # 监听端口
bindIp: 0.0.0.0 # 绑定到所有IPv4地址
security:
authorization: enabled # 启用权限验证
创建数据目录和日志目录
mkdir -pv /data/mongodb
mkdir -pv /usr/local/mongodb/logs
创建用户并授权
useradd -s /bin/false -M mongod
chown -R mongod:mongod /usr/local/mongodb*
chown -R mongod:mongod /data/mongodb/
配置开机自启动文件
vim /usr/lib/systemd/system/mongod.service
[Unit]
Description=MongoDB Database Server
Documentation=https://docs.mongodb.org/manual
After=network-online.target
Wants=network-online.target
[Service]
Type=forking
User=mongod
Group=mongod
Environment="OPTIONS=-f /usr/local/mongodb/etc/mongod.conf"
ExecStart=/usr/local/mongodb/bin/mongod $OPTIONS
ExecStop=/usr/local/mongodb/bin/mongod --shutdown $OPTIONS
RuntimeDirectory=mongodb
LimitFSIZE=infinity
LimitCPU=infinity
LimitAS=infinity
LimitNOFILE=64000
LimitNPROC=64000
LimitMEMLOCK=infinity
TasksMax=infinity
TasksAccounting=false
[Install]
WantedBy=multi-user.target
启动MongoDB
systemctl daemon-reload
systemctl enable --now mongod.service
安装MongoDB 的交互式 Shell 工具 MongoSH
下载MongoSH
wget https://downloads.mongodb.com/compass/mongosh-2.3.1-linux-x64.tgz
解压安装MongoSH
tar xvf mongosh-2.3.1-linux-x64.tgz
mv mongosh-2.3.1-linux-x64 /usr/local/mongosh-2.3.1
ln -s /usr/local/mongosh-2.3.1 /usr/local/mongosh
创建超级管理员账号
/usr/local/mongosh/bin/mongosh --host localhost --port 27017
test> use admin
admin> db.createUser({user: "root", pwd: "xxx.com", roles: ["root"]})
{ ok: 1 }

“OK”状态码为1,表示操作成功执行,其余都表示操作没有成功完成。
使用root用户登录
/usr/local/mongosh/bin/mongosh --host localhost --port 27017 -u root -p

MongoDB常用命令
show databases //显示所有数据库
use admin //切换数据库,数据库不存在自动创建
help //显示命令行帮助
show.help //显示命令帮助
数据库操作
use xxx //切换数据库,数据库不存在自动创建
db.dropDatabase() //删除当前数据库
show dbs 或 show databases //显示所有数据库的列表
集合操作
db.createCollection("xxx"); //创建一个名为一个xxx的集合
show collections; //显示当前数据库中的所有集合
db.xxx.drop(); //删除指定的集合
文档操作
db.xxx.insertOne({ //向集合中插入一个新文档
name: "xxx",
age: 20,
email: "xxx@xxx.com"
});
db.xxx.insertMany([ //向集合中插入多个文档
{
name: "www",
age: 20,
email: "www@www.com"
},
{
name: "xwx",
age: 20,
email: "xwx@xwx.com"
}
]);
db.xxx.find({}); //查询xxx集合中的所有文档
db.xxx.find({ age: 20 }); //查询xxx集合中年龄为20的用户
db.xxx.findOne({ age: 20 }); //查询xxx集合中第一个年龄为20的用户
db.xxx.updateOne({ name: "www" }, { $set: { age: 23 } }); //将xxx集合中第一个名为"www"的用户的年龄更新为23
db.xxx.updateMany({ name: "xwx" }, { $set: { age: 23 } }); //将xxx集合中所有名为"xwx"的用户的年龄更新为23
db.xxx.deleteOne({ name: "xwx" }); //删除xxx集合中第一个名为"xwx"的用户
db.xxx.deleteMany({ age: 23 }); //删除xxx集合中所有年龄为23的用户
索引操作
db.xxx.createIndex({ email: 1 }, { unique: true }); //在email字段上创建一个唯一索引
db.xxx.getIndexes(); //获取集合上的所有索引
db.xxx.dropIndex("email_1"); //删除指定的索引
聚合操作
db.orders.insertMany([ //创建集合并插入数据
{
"_id": ObjectId("507f191e810c19729de860ea"),
"customer": "name-A",
"amount": 350,
"date": ISODate("2023-03-15T08:00:00Z")
},
{
"_id": ObjectId("507f191e810c19729de860eb"),
"customer": "name-B",
"amount": 150,
"date": ISODate("2023-03-16T09:00:00Z")
},
{
"_id": ObjectId("507f191e810c19729de860ec"),
"customer": "name-C",
"amount": 100,
"date": ISODate("2023-03-17T10:00:00Z")
},
{
"_id": ObjectId("507f191e810c19729de860ed"),
"customer": "name-D",
"amount": 300,
"date": ISODate("2023-03-18T11:00:00Z")
},
{
"_id": ObjectId("507f191e810c19729de860ee"),
"customer": "name-E",
"amount": 200,
"date": ISODate("2023-03-19T12:00:00Z")
}
]);
db.orders.find(); //检查数据是否插入成功
db.orders.aggregate([ //执行聚合查询
{
$group: {
_id: "$customer", // 按客户名称分组
totalAmount: { $sum: "$amount" } // 计算每个客户的总订单金额
}
},
{
$sort: {
totalAmount: -1 // 按总订单金额降序排序
}
}
]);
计算年龄小于30的用户数量
db.users.countDocuments({ age: { $lt: 30 } });
$gt
:大于,$gte
:大于等于,$lt
:小于,$lte
:小于等于,$eq
:等于,$ne
:不等于
获取所有不同的用户名称
db.xxx.distinct("name");
获取当前数据库的统计信息
db.runCommand({ dbStats: 1 });或db.stats();
获取MongoDB服务器的状态信息
db.serverStatus();
查找并修改文档
db.users.findAndModify({
query: { verified: false },
update: { $set: { verified: true } },
new: false // 返回修改前的文档
});