1. 程式人生 > 其它 >2020~2021學年第一學期 《NOSQL資料庫技術》期末考試試卷

2020~2021學年第一學期 《NOSQL資料庫技術》期末考試試卷

技術標籤:NOSQL資料庫技術mongodbnosql

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);  } }