MongoDB的摆设和操纵

[复制链接]
发表于 2025-11-13 15:03:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
一.数据库的摆设与设置

1.单MongoDB服务器的摆设
(1)将服务器、客户端和工具安装包上传到hadoop1的/export/software目次

(2)利用解压缩下令:
·tar -xzf /export/software/mongodb-linux-x86_64-rhel90-7.0.15.tgz -C /export/servers/
·tar -xzf /export/software/mongosh-2.3.3-linux-x64.tgz -C /export/servers/
·tar -xzf /export/software/mongodb-database-tools-rhel93-x86_64-100.10.0.tgz -C /export/servers/
对以上三个压缩包举行解压缩至/export/servers目次下

(3)创建数据库数据存储目次和日记文件:
·mkdir -p /export/data/mongodb/db/data
·mkdir -p /export/data/mongodb/db/logs
·touch /export/data/mongodb/db/logs/1.log
(4)进入MongoDB服务器目次:
·cd /export/servers/mongodb-linux-x86_64-rhel90-7.0.15/bin
(5)启动服务:
·./mongod --dbpath /export/data/mongodb/db/data/ --logpath /export/data/mongodb/db/logs/1.log --bind_ip hadoop1 --port 27017 --fork,表现“child process started successfully”,证实启动乐成

(6)在客户端利用下面下令登录服务器:
·cd /export/servers/mongosh-2.3.3-linux-x64/bin
·./mongosh --host hadoop1:27017

2.MongoDB复制集的摆设
2.1 单机摆设
(1)创建存放MongoDB副本集数据的目次:
·mkdir -p /export/data/mongodb/replicaset1/data
·mkdir -p /export/data/mongodb/replicaset2/data
·mkdir -p /export/data/mongodb/replicaset3/data
(2)创建存放MongoDB副本集日记的目次:
·mkdir -p /export/data/mongodb/replicaset1/logs
·mkdir -p /export/data/mongodb/replicaset2/logs
·mkdir -p /export/data/mongodb/replicaset3/logs
(3)在MongoDB副本集日记的目次下创建日记文件:
·touch /export/data/mongodb/replicaset1/logs/mongodb.log
·touch /export/data/mongodb/replicaset2/logs/mongodb.log
·touch /export/data/mongodb/replicaset3/logs/mongodb.log
(4)以副本集的方法启动MongoDB:
·cd /export/servers/mongodb-linux-x86_64-rhel90-7.0.15/bin
·./mongod --replSet test_replica_set --dbpath=/export/data/mongodb/replicaset1/data/ --logpath=/export/data/mongodb/replicaset1/logs/mongodb.log --port 27018 --bind_ip localhost --logappend --fork
·./mongod --replSet test_replica_set --dbpath=/export/data/mongodb/replicaset2/data/ --logpath=/export/data/mongodb/replicaset2/logs/mongodb.log --port 27019 --bind_ip localhost --logappend --fork
·./mongod --replSet test_replica_set --dbpath=/export/data/mongodb/replicaset3/data/ --logpath=/export/data/mongodb/replicaset3/logs/mongodb.log --port 27020 --bind_ip localhost --logappend --fork

注:三个副本集启动的效果除forked process差别等外,别的根本同等,不再展示

(5)毗连到MongoDB:

·cd /export/servers/mongosh-2.3.3-linux-x64/bin

·./mongosh --host localhost --port 27018


(6)举行初始化:

·rs.initiate()


·rs.add("localhost:27019")


·rs.add("localhost:27020")


(7)关闭每个节点的MongoDB服务器:

•cd /export/servers/mongodb-linux-x86_64-rhel90-7.0.15/bin

•./mongod --shutdown --dbpath=/export/data/mongodb/replicaset1/data/ --port 27018


•./mongod --shutdown --dbpath=/export/data/mongodb/replicaset2/data/ --port 27019


•./mongod --shutdown --dbpath=/export/data/mongodb/replicaset3/data/ --port 27020


注:受篇幅限定,下述步调仅供参考,完备操纵截图的word版本可见上方本博文免费资源绑定。

2.2 分布式摆设

(1)三个节点上都必要安装启动mongod服务器,将hadoop1的mongod分发到hadoop2和hadoop3:

·scp -r /export/servers/mongodb-linux-x86_64-rhel90-7.0.15/ hadoop2:/export/servers/

·scp -r /export/servers/mongodb-linux-x86_64-rhel90-7.0.15/ hadoop3:/export/servers/

·scp -r /export/servers/mongosh-2.3.3-linux-x64/ hadoop2:/export/servers/

·scp -r /export/servers/mongosh-2.3.3-linux-x64/ hadoop3:/export/servers/

(2)创建存放MongoDB副本集数据的目次:

·mkdir -p /export/data/mongodb/replicaset/data

(3)创建存放MongoDB副本集日记的目次:

·mkdir -p /export/data/mongodb/replicaset/logs

(4)在MongoDB副本集日记的目次下创建日记文件:

·touch /export/data/mongodb/replicaset/logs/mongodb.log

(5)在三个假造机上以副本集的方法启动MongoDB

·cd /export/servers/mongodb-linux-x86_64-rhel90-7.0.15/bin

在Hadoop1上实验:./mongod --replSet test_replica_set --dbpath=/export/data/mongodb/replicaset/data/ --logpath=/export/data/mongodb/replicaset/logs/mongodb.log --port 27017 --bind_ip hadoop1 --logappend --fork

在Hadoop2上实验:./mongod --replSet test_replica_set --dbpath=/export/data/mongodb/replicaset/data/ --logpath=/export/data/mongodb/replicaset/logs/mongodb.log --port 27017 --bind_ip hadoop2 --logappend --fork

在Hadoop3上实验:./mongod --replSet test_replica_set --dbpath=/export/data/mongodb/replicaset/data/ --logpath=/export/data/mongodb/replicaset/logs/mongodb.log --port 27017 --bind_ip hadoop3 --logappend --fork


注:在Hadoop2和Hadoop3上启动副本集的效果与Hadoop1雷同,不再展示


(6)举行初始化:rs.initiate({_id:"test_replica_set", members:[{_id :0,host:"hadoop1:27017"},{_id:1,host:"hadoop2:27017"}, {_id:2,host:"hadoop3:27017"]})


(7)测试是否同步:在Hadoop1上写入数据

•cd /export/servers/mongosh-2.3.3-linux-x64/bin

•./mongosh --host hadoop1 --port 27017

•>db.mycol.insertOne({item1: 'first item'})

(8)在Hadoop2上查抄数据

•cd /export/servers/mongosh-2.3.3-linux-x64/bin

•./mongosh --host hadoop2 --port 27017

• > db.mycol.find()

可以发现Hadoop2与Hadoop1数据同步

(9)关闭每个节点的MongoDB服务器:

•cd /export/servers/mongodb-linux-x86_64-rhel90-7.0.15/bin

•./mongod -shutdown --dbpath=/export/data/mongodb/replicaset/data/ --port 27017

3.MongoDB集群的完备摆设

(1)在hadoop1创建目次

存放分片集群的相干设置文件,数据和日记:mkdir -p /export/data/mongodb/sharedcluster/

存放相干设置文件:mkdir -p /export/data/mongodb/sharedcluster/configFile

存放config服务器的数据文件:mkdir -p /export/data/mongodb/sharedcluster/configserver_data

存放分片服务器shard1、shard2、shard3的数据文件:

·mkdir -p /export/data/mongodb/sharedcluster/shard1_data

·mkdir -p /export/data/mongodb/sharedcluster/shard2_data

·mkdir -p /export/data/mongodb/sharedcluster/shard3_data

存放日记文件,包罗config服务器、分片服务器和mongos服务器:mkdir -p /export/data/mongodb/sharedcluster/logs

config服务器的日记文件:touch /export/data/mongodb/sharedcluster/logs/configserver.log

分片服务器shard1、shard2、shard3的日记文件:

·touch /export/data/mongodb/sharedcluster/logs/shard1.log

·touch /export/data/mongodb/sharedcluster/logs/shard2.log

·touch /export/data/mongodb/sharedcluster/logs/shard3.log

mongos服务器的日记文件:touch /export/data/mongodb/sharedcluster/logs/mongos.log

上述创建效果如下图所示:

(2)分发到hadoop2和hadoop3

·scp -r /export/data/mongodb/sharedcluster hadoop2:/export/data/mongodb/

·scp -r /export/data/mongodb/sharedcluster hadoop3:/export/data/mongodb/

注:hadoop3分发效果与Hadoop2雷同,不再展示

(3)创建Hadoop1、Hadoop2、Hadoop3的shard1,shard2,shard3设置文件

·vi /export/data/mongodb/sharedcluster/configFile/shard1.conf

·vi /export/data/mongodb/sharedcluster/configFile/shard2.conf

·vi /export/data/mongodb/sharedcluster/configFile/shard3.conf

对于Hadoop1的shard2和shard3,分别修改对应的replSet为对应的shard2和shard3;对于Hadoop2和Hadoop3的除replSet的修改,还必要将bind_ip修改为对应的hadoop2和hadoop3

(4)分别在三台服务器上启动3个shard (共启动9个mongod服务器),实验

·cd /export/servers/mongodb-linux-x86_64-rhel90-7.0.15/bin

·./mongod -f /export/data/mongodb/sharedcluster/configFile/shard1.conf

·./mongod -f /export/data/mongodb/sharedcluster/configFile/shard2.conf

·./mongod -f /export/data/mongodb/sharedcluster/configFile/shard3.conf

注:Hadoop2和Hadoop3的启动雷同于Hadoop1,不再展示

(5)摆设shard:

在hadoop1登录:

·cd /export/servers/mongosh-2.3.3-linux-x64/bin

·./mongosh --host hadoop1 --port 27018

初始化副本集:

·rs.initiate()

·rs.add('hadoop2:27018')

·rs.add('hadoop3:27018')

检察副本集状态: > rs.status()

(6)在Hadoop2和Hadoop3上摆设shard的步调与Hadoop1雷同,下面给出相干操纵,实验效果不再给出

在hadoop2登录:

·cd /export/servers/mongosh-2.3.3-linux-x64/bin

·./mongosh --host hadoop2 --port 27019

初始化副本集:

·rs.initiate()

·rs.add('hadoop3:27019')

·rs.add('hadoop1:27019')

检察副本集状态: > rs.status()

在hadoop3登录:

·cd /export/servers/mongosh-2.3.3-linux-x64/bin

·./mongosh --host hadoop3 --port 27020

初始化副本集:

·rs.initiate()

·rs.add('hadoop1:27020')

·rs.add('hadoop2:27020')

检察副本集状态: > rs.status()


  • 摆设config server,创建hadoop1的config server设置文件:vi /export/data/mongodb/sharedcluster/configFile/configserver.conf
文件内容如下:

dbpath=/export/data/mongodb/sharedcluster/configserver_data

logpath=/export/data/mongodb/sharedcluster/logs/configserver.log

port=27022

bind_ip=hadoop1

logappend=true

fork=true

replSet=configs

#Config Server

configsvr=true


  • hadoop2和hadoop3也分别创建configserver.conf文件,但需修改hadoop2,hadoop3中设置文件的bind_ip分别为hadoop2,hadoop3。
  • 在三个节点中分别启动config server
·cd /export/servers/mongodb-linux-x86_64-rhel90-7.0.15/bin

·./mongod -f /export/data/mongodb/sharedcluster/configFile/configserver.conf

注:三个节点启动效果根本同等,不再过多展示

(10)设置config server副本集,在hadoop1登录:

·cd /export/servers/mongosh-2.3.3-linux-x64/bin

·./mongosh --host hadoop1 --port 27022

(11)初始化副本集:

•rs.initiate()

•rs.add('hadoop2:27022')

•rs.add('hadoop3:27022')

(12)摆设mongos:

在hadoop1上创创建置文件

·vi /export/data/mongodb/sharedcluster/configFile/mongos.conf

内容如下:

logpath=/export/data/mongodb/sharedcluster/logs/mongos.log

port=27021

bind_ip=hadoop1

logappend=true

fork=true

configdb=configs/hadoop1:27022,hadoop2:27022,hadoop3:27022

在hadoop2上创创建置文件

·vi /export/data/mongodb/sharedcluster/configFile/mongos.conf

内容将Hadoop1中的bind_ip修改为hadoop2

(12)分别在hadoop1和hadoop2上启动mongos

·cd /export/servers/mongodb-linux-x86_64-rhel90-7.0.15/bin

·./mongos -f /export/data/mongodb/sharedcluster/configFile/mongos.conf

(13)启动分片功能,在hadoop1登录mongos:

·cd /export/servers/mongosh-2.3.3-linux-x64/bin

·./mongosh --host hadoop1 --port 27021

(14)切换到数据库gateway

·mongos> use gateway

向分片集集群添加三个shard

·sh.addShard("shard1/hadoop1:27018,hadoop2:27018,hadoop3:27018")

·sh.addShard("shard2/hadoop1:27019,hadoop2:27019,hadoop3:27019")

·sh.addShard("shard3/hadoop1:27020,hadoop2:27020,hadoop3:27020")

(15)shard操纵

·use admin

·db.runCommand({ listshards : 1})

(16)mongos是无状态的节点,在hadoop1上直接kill掉:

·找到进程号:ps aux | grep mongos

·kill -9 pid

(17)三个节点分别实验下面的下令来config server和三个副本集:

·/export/servers/mongodb-linux-x86_64-rhel90-7.0.15/bin/mongod --shutdown -f /export/data/mongodb/sharedcluster/configFile/configserver.conf


·/export/servers/mongodb-linux-x86_64-rhel90-7.0.15/bin/mongod --shutdown -f /export/data/mongodb/sharedcluster/configFile/shard1.conf


·/export/servers/mongodb-linux-x86_64-rhel90-7.0.15/bin/mongod --shutdown -f /export/data/mongodb/sharedcluster/configFile/shard2.conf


·/export/servers/mongodb-linux-x86_64-rhel90-7.0.15/bin/mongod --shutdown -f /export/data/mongodb/sharedcluster/configFile/shard3.conf


二.利用下令访问数据库

1.数据库:检察、利用和删除数据库
(1)检察当前数据库:db,即可返回当前数据库名称
(2)检察全部数据库:show database
(3)切换利用数据库(假如数据库不存在,则 MongoDB 会创建它):use mydb
(4)删除数据库:db.dropDatabase()
2.聚集:检察、创建和删除聚集
(1)创建聚集(若聚集不存在,MongoDB 会主动创建聚集):

db.createCollection("user")

(2)检察当前数据库中的全部聚集:show collections

(3)删除聚集:db.user.drop()

3.文档:文档插入、文档查询、文档更新和文档删除
(1)插入文档:
db.users.insertMany([
  {name: "Alice", age: 30, city: "New York"},
  {name: "Bob", age: 25, city: "Los Angeles"},
  {name: "Charlie", age: 35, city: "Chicago"},
  {name: "David", age: 28, city: "New York"},
  {name: "Eve", age: 22, city: "Los Angeles"}
])
(2)文档查询
①查询全部文档:db.users.find()
②查询符合条件的文档(查询age>25):db.users.find({age: {$gt: 25}})
③查询一个name为Alice的文档:db.users.findOne({name: "Alice"})
(3)文档更新
①更新单个文档,更新Alice的年事为31
db.users.updateOne(
  {name: "Alice"},
  {$set: {age: 31}}
)
②更新多个文档,更新全部city为Los Angeles的为San Francisco
db.users.updateMany(
  {city: "Los Angeles"},
  {$set: {city: "San Francisco"}}
)
(4)删除文档
①删除单个文档,删除名为Eve的文档:db.users.deleteOne({name: "Eve"})
②删除多个文档,删除年事为30的多个文档:db.users.deleteMany({age: {$lt: 30}})
4.聚合和管道:$group,$project,$match,$sort,$limit和$skip
(1)聚合
①利用 $match 来筛选出 age 大于 25 的用户:
db.users.aggregate([
  {$match: {age: {$gt: 25}}}
])
②$group:按 city 分组并盘算每个都会的用户数量:
db.users.aggregate([
  {$group: {_id: "$city", totalUsers: {$sum: 1}}}
])
③$project:仅表现 name 和 age 字段:
db.users.aggregate([
  {$project: {name: 1, age: 1, _id: 0}}
])
④$sort:按 age 降序分列
db.users.aggregate([
  {$sort: {age: -1}}
])
⑤$limit:限定返回前 3 条记载
db.users.aggregate([
  {$limit: 1}
])
⑥$skip:跳过前 1 条记载
db.users.aggregate([
  {$skip: 1}
])
(2)组合:筛选年事大于 25 的用户,按都会分组,并按用户总数降序排序,限定返回 3 条记载
db.users.aggregate([
  {$match: {age: {$gt: 25}}},
  {$group: {_id: "$city", totalUsers: {$sum: 1}}},
  {$sort: {totalUsers: -1}},
  {$limit: 3}
])
5.索引:索引的创建、检察和删除
(1)创建一个单字段索引(根据 name 字段):db.users.createIndex({name: 1})
(2)创建复合索引(根据 age 和 city 字段):db.users.createIndex({age: 1, city: 1})
(3)检察索引:db.users.getIndexes()
(4)根据索引名称删除:db.users.dropIndex("name_1")
(5)删除全部索引:db.users.dropIndexes()
三.数据库的计划

在MongoDB中,利用“聚集”来存储数据,每个聚集内包罗多个“文档”。每个文档是一个雷同JSON格式的数据结构,存储与实体相干的信息。图书管理体系包罗三个重要实体:图书、读者和借阅记载。它们之间通过一个关系来举行接洽,借阅记载表现图书与读者之间的借阅关系,本体系共计划三个聚集,分别是图聚集(存储图书的相干信息)、读者聚集(存储读者的根本信息)和借阅记载聚集(存储借阅的记载)。
1.数据库计划
(1)图书聚集
聚集名:Books
_id:唯一标识图书(相称于图书ID)。
title:图书名称。
category:图书种别(如文学、小说等)。
published_date:图书出书日期。
author:作者信息,包罗作者名称和出生日期。
publisher:出书商信息,包罗出书商名称和地点。
(2)读者聚集
读者名:Readers
_id:唯一标识读者(相称于读者ID)。
reader_name:读者的姓名。
dob:读者的出生日期。
contact:接洽信息,包罗电子邮件、电话和地点。
(3)借阅记载聚集
聚集名:BorrowRecords
_id:唯一标识借阅记载(相称于借阅记载ID)。
book_id:借阅的图书ID,关联到Books聚集中的_id。
borrow_date:借阅日期。
return_date:归还日期。
reader:读者信息,包罗读者ID和读者姓名。
(4)实体和关系的增编削查
①新增操纵
新增图书:通过插入新的文档到Books聚集中。
新增借阅记载:通过插入新的文档到BorrowRecords聚集中。
新增读者:通过插入新的文档到Readers聚集中。
②删除操纵
删除图书:通过_id删除Books聚集中的文档。
删除借阅记载:通过_id删除BorrowRecords聚集中的文档。
删除读者:通过_id删除Readers聚集中的文档。
③更新操纵
更新图书信息:通过_id在Books聚集中更新相干字段(如书名、作者等)。
更新借阅记载:通过_id在BorrowRecords聚集中更新借阅日期或归还日期。
更新读者信息:通过_id在Readers聚集中更新读者姓名、接洽方式等。
④查询操纵
查询图书信息:通过_id查询Books聚集中对应图书的信息。
查询借阅记载:通过book_id查询BorrowRecords聚集中全部借阅该图书的记载。
查询读者借阅记载:通过reader_id查询BorrowRecords聚集中该读者的借阅记载。
查询读者信息:通过_id查询Readers聚集中该读者的具体信息。
2.聚集计划与填凑数据
(1)图书聚集
{
    "_id": "B001",
    "title": "活着",
    "category": "文学",
    "published_date": "1993-06-01",
    "author": {
        "name": "余华",
        "birth_date": "1960-04-03"
    },
    "publisher": {
        "publisher_name": "作家出书社",
        "publisher_address": "北京市向阳区"
    }
},
{
    "_id": "B002",
    "title": "百年孤独",
    "category": "小说",
    "published_date": "1967-06-05",
    "author": {
        "name": "加西亚·马尔克斯",
        "birth_date": "1927-03-06"
    },
    "publisher": {
        "publisher_name": "南海出书公司",
        "publisher_address": "上海市徐汇区"
    }
}
(2)读者聚集
{
    "_id": "R001",
    "reader_name": "张三",
    "dob": "1990-05-15",
    "contact": {
        "email": "[email protected]",
        "phone_number": "123-4567-8901",
        "address": "北京市海淀区"
    }
},
{
    "_id": "R002",
    "reader_name": "李四",
    "dob": "2005-02-28",
    "contact": {
        "email": "[email protected]",
        "phone_number": "987-6543-2100",
        "address": "上海市浦东新区"
    }
}
(3)借阅记载聚集
{
    "_id": "BR001",
    "book_id": "B001",
    "borrow_date": "2024-11-01",
    "return_date": "2024-11-15",
    "reader": {
        "reader_id": "R001",
        "reader_name": "张三"
    }
},
{
    "_id": "BR002",
    "book_id": "B002",
    "borrow_date": "2024-11-02",
    "return_date": "2024-11-20",
    "reader": {
        "reader_id": "R002",
        "reader_name": "李四"
    }
}


四.编程实现数据库的访问

利用Python访问实现计划的图书管理体系的MongoDB 数据库,步调如下:
(1)毗连 MongoDB 数据库,创建LibraryDB数据库并创建图书聚集、读者聚集、借阅记载聚集
from pymongo import MongoClient

client = MongoClient('mongodb://hadoop1:27017/')

# 选择数据库(假如没有数据库,MongoDB会主动创建)
db = client['LibraryDB']

books_collection = db['Books']
readers_collection = db['Readers']
borrow_records_collection = db['BorrowRecords']
(2)插入图书、读者和借阅记载文档
book_document = {
    "_id": "B001",
    "title": "活着",
    "category": "文学",
    "published_date": "1993-06-01",
    "author": {
        "name": "余华",
        "birth_date": "1960-04-03"
    },
    "publisher": {
        "publisher_name": "作家出书社",
        "publisher_address": "北京市向阳区"
    }
}

# 插入单个文档
books_collection.insert_one(book_document)

# 插入多个文档
books_collection.insert_many([
    {
        "_id": "B002",
        "title": "百年孤独",
        "category": "小说",
        "published_date": "1967-06-05",
        "author": {
            "name": "加西亚·马尔克斯",
            "birth_date": "1927-03-06"
        },
        "publisher": {
            "publisher_name": "南海出书公司",
            "publisher_address": "上海市徐汇区"
        }
    }
])

reader_document = {
    "_id": "R001",
    "reader_name": "张三",
    "dob": "1990-05-15",
    "contact": {
        "email": "[email protected]",
        "phone_number": "123-4567-8901",
        "address": "北京市海淀区"
    }
}

readers_collection.insert_one(reader_document)

borrow_record_document = {
    "_id": "BR001",
    "book_id": "B001",
    "borrow_date": "2024-11-01",
    "return_date": "2024-11-15",
    "reader": {
        "reader_id": "R001",
        "reader_name": "张三"
    }
}

borrow_records_collection.insert_one(borrow_record_document)
实验效果如下图所示:
(3)查询全部图书
# 查询Books聚集中的全部文档
for book in books_collection.find():
    print(book)
(4)查询某本图书的具体信息(按_id查找)
# 查询某本图书的具体信息
book_id = "B001"
book = books_collection.find_one({"_id": book_id})
print(book)
(5)查询某位读者的借阅记载
# 查询某位读者的借阅记载
reader_id = "R001"
borrow_records = borrow_records_collection.find({"reader.reader_id": reader_id})

for record in borrow_records:
    print(record)
(6)更新图书信息(按_id更新)
# 更新图书的书名和种别
books_collection.update_one(
    {"_id": "B001"},
    {"$set": {"title": "活着(修订版)", "category": "当代文学"}}
)
(7)更新借阅记载的归还日期
# 更新借阅记载的归还日期
borrow_records_collection.update_one(
    {"_id": "BR001"},
    {"$set": {"return_date": "2024-11-18"}}
)
(8)删除某本图书(按_id删除)
# 删除图书
books_collection.delete_one({"_id": "B002"})
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表