Linux安装MongoDB

  • A+
所属分类:MongoDB


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 }
Linux安装MongoDB

“OK”状态码为1,表示操作成功执行,其余都表示操作没有成功完成。

使用root用户登录

/usr/local/mongosh/bin/mongosh --host localhost --port 27017 -u root -p
Linux安装MongoDB

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 // 返回修改前的文档
});
xxx