2020~2021学年第一学期 《NOSQL数据库技术》期末考试试卷

2020~2021学年第一学期 《NOSQL数据库技术》期末考试试卷

一、Studb库中的数据集合Student中的文档如下图。根据文档内容写出解决以下问题的命令,(其中SNO为学号,SNAME为姓名,DEPT为系,SEX为性别,AGE为年龄,CREDIT 为学分,REMARKS 为备注)。(每小题3分,共60分)
在这里插入图片描述
1.创建一个集合Student。

use Studb;
db.createCollection(“Student”);

2.在Student集合中添加一个学生文档: SNO:“001244",
SNAME:“张三”,DEPT:“计算机”,CREDIT:30。

db.Student.insert( {“SNO”: “001244", “SNAME”: “张三",
“DEPT”: “计算机", “CREDIT”:30 } );

3.查询姓名为“张三”的信息,结果不显示“id”,显示“SNO”、“SNAME”。

db.Student.find( {“SNAME”: “张三”},
{“_id”: 0, “SNO”: 1, “SNAME”: 1} ).pretty();

4.删除姓名为“张三”的文档。

db.Student.remove( {“SNAME”: “张三"} );

5.查询姓名不是“张三”的信息。

db.Student.find( {“SNAME”: {“$ne”: “张三"} } ).pretty();

6.查询年龄在18~ 20岁的学生信息。

db.Student.find( {“AGE": {“$gte":18, “$lte":20} } ).pretty();

7.查询年龄大于18岁,或者学分大于50分的学生信息。

db.Student.find( {“$or”: [
{“AGE”: { “$gt": 18} },
{“CREDIT”: { “$gt ": 50} } ] } ).pretty();

8.查询姓名是“王林”、“李计”、“王敏”的学生信息。

db.Student.find({“SNAME”:{“$in":[“王林",“李计",“王敏"]}}).pretty();

9.查询含有备注成员的学生信息。

db.Student.find({“REMARKS”:{“$exists":true}}).pretty();

10.查询姓名有“李”的学生信息。

db.Student.find({“SNAME”:{“$regex”: // } }).pretty();

11.查询学生所有信息,结果以学分降序排列。

db.Student.find().sort( {“CREDIT”: -1} ).pretty();
#(注:升序(1),降序(-1))

12.若每页只显示5行数据,则显示第二页5行数据命令是什么。

db.Student.find().skip(5).limit(5).sort( {“CERDIT”: -1} ).pretty();

13.将年龄是18岁的学生的学分都更新为50分。

db.Student.update({“AGE”:18},{“$set”:{“CREDIT”:50}},false,true);
#(注:若只更新第一条记录,则后面写false,false。
#第一个false表示不增加;第二个true表示全更新。)

14.删除“王燕”的年龄与学分信息。

db.Student.update( {“SNAME”: “王燕"},
{“$unset”: {“AGE”:1,“CREDIT”:1} } );

15.利用游标返回所有学生的姓名信息。

var cursor = db.Student.find();
// 循环游标
while( cursor.hasNext() )  {
var doc = cursor.next();
printjson(doc.SNAME);
}
#(注:判断是否有下一行数据:hasNext();取出当前数据:next())

16.创建一个索引,在姓名字段上设置一个降序索引。

db.Student.ensureIndex( {“SNAME”:-1} );

17.利用聚合框架求每个专业的学生数。

db.Student.aggregate( [ {“$group”:{“_id”:“$DEPT",
dept_count: {“$sum” : 1} } } ] );

18.利用聚合框架求每个专业的最高与最低学分。

db.Student.aggregate( [ {“$group”: {
“_id”: “$DEPT",
“max_ CREDIT”: {“$max”: “$CREDIT"},
“ min_ CREDIT”: {“$min”: “$CREDIT"} } } ] );

19.删除数据集合Student。

db.Student.drop();

20.删除数据库Studb。

use Studb;
db.dropDataBase(); 

二、在Studb数据库中创建一个可以执行读写操作的用户,用户名为你的姓名,密码为你的学号,写出创建用户,并授权登录服务器的相关命令。(10分)

use Studb;
db.createUser ( {
“user”: “lsq",
“pwd”: “123456",
“roles”: [ {“role”: “readWrite ", “db”: “Studb"} ] } );
//该用户可以读写Studb库数据
dbpath = E:\MongoDB\data //设置数据目录的路径
logpath = E:\MongoDB\log\mongodb.log //设置日志信息的文件路径
logappend = true //打开日志输出操作
port = 27017
mongo localhost: 27001/Studb  -u  lsq  -p  123456
//db.changePassword(“123456”, “123456789”);  //修改密码 

三、Mongodb中的复制与分片的含义是什么?请举例说明复制的实现过程。(15分)

答:(1)复制含义:
Mongodb复制集是从传统主从结构(Master/Slave)演变而来,是由一组拥有相同数据集的mongod实例所组成的集群,一个复制集包含多个数据节点和一个选举节点。数据节点中仅有一个为主节点(Primary),其他的为从节点(Secondary)。对于主节点,所有的请求都是在它上面完成的,从节点接收主节点传来的操作并以此来保证与主节点上的数据完全一致。需注意只有主节点能接收写操作,从节点是绝对无法写入的。复制集是通过复制而实现数据的冗余进而提高数据的可靠性。

(2)分片含义:
分片(sharding)是指将数据库拆分,将其分散在不同的机器上的过程。分片集群(sharded cluster)是一种水平扩展数据库系统性能的方法,能够将数据集分布式存储在不同的分片(shard)上,每个分片只保存数据集的一部分,MongoDB保证各个分片之间不会有重复的数据,所有分片保存的数据之和就是完整的数据集。分片集群将数据集分布式存储,能够将负载分摊到多个分片上,每个分片只负责读写一部分数据,充分利用了各个shard的系统资源,提高数据库系统的吞吐量。

(3)复制的实现过程:
所有的读写请求都是由客户端应用程序通过驱动来指向MongoDB数据库,写请求都是指向当前数据库的主节点,写请求执行完毕后,会记录在主节点的oplog中(记录写操作而不记录读操作),从节点通过主节点的oplog来进行复制操作。

举例:

创建mongodb配置文件(mongo.conf)
#配置文件保存位置
/opt/mongo/mongo.conf
fork = true
dbpath = /opt/mongo/data/db
port = 27017
bind_ip = 0.0.0.0
logpath = /opt/mongo/logs/mongodb.log
logappend = true
#复制集的名字
replSet = lsq_repl
smallfiles = true
#3台机器分别创建配置文件和对应的数据、日志目录
启动mongo服务,配置复制集
#3台都启动
./mongod –config /opt/mongo/mongo.conf
#查看是否启动成功
netstat –ntlp
#进入mongo客户端
./mongo
#配置复制集
var rsconf = {
_id: ‘lsq_repl’,  
//_id要与配置文件中指定的服务所属的复制集相同
members:  //复制集成员
[
{
_id: 1,  //成员的id
host: ‘192.168.57.201 : 27017//成员所属节点的ip以及该成员服务启动时所占的端口
},
{
_id: 2,
host: ‘192.168.57.202 : 27017’
},
{
_id: 3,
host: ‘192.168.57.203 : 27017’
} ] }
#初始化配置(加载rsconf配置文件)
rs.initiate(rsconf);
#状态查看
rs.status();

四、编写程序,利用某一开发工具连接MongoDB数据库,数据库为本地数据库,集合为student,用户名为你的姓名,密码为你的学号,连接好后执行查询操作返回集合中的所有数据,并分页显示,每页显示5个文档。(15 分)

#连接:
MongoClient mongoClient;
MongoCredential credential = MongoCredential.createCredential
(“用户名(你的姓名)", “student", “密码(你的学号)");
mongoClient = new MongoClient( new ServerAddress(ip, port), Arrays.asList(credential) );
#分页:
package util;
import org.bson.Document;
import com.mongodb.MongoClient;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
public class Test {
	public static void findDocumentByLimit(int pagesize, int pageindex)  {
	try {
	//通过用户名、密码登录
   /***
ServerAddress serverAdd = new ServerAddress(“localhost”,27017);
MongoCredential cred = MongoCredential.createScramShalCredential
(“lsq”, “admin”, “123456”.toCharArray() );
//通过连接认证获取MongoDB连接
MongoClient monClit = new MongoClient( Arrays.asList(serverAdd), Arrays.asList(cred) );
***/
//直接登录
//连接到mongodb服务
MongoClient monClit = new MongoClient(“localhost”,27017);
MongoCredential cred = MongoCredential.createScramShalCredential
(“lsq”, “admin”,123456.toCharArray() );
//连接到数据库
MongoDatabase database = monClit.getDatabase(“mldn”);
MongoCollection<Document> collection = database.getCollection
(“student”);
//进行查询
FindIterable<Document> find = collection.find().skip( (pageindex-1) * pagesize ).limit(pagesize);
for(Document document : find)  {
	System.out.println(document.getString(“SNO”) + “\t” + document.getString(“SNAME”) + “\t”);  } }
catch (Exception e)  {
	e.printStackTrace();  } }
public static void main(String[] args)  {
findDocumentByLimit(0,5);  } }

猜你喜欢

转载自blog.csdn.net/qq_46649692/article/details/111572472