面試問題
介紹
mongoDB 是一種文檔性的數(shù)據(jù)庫。文檔的數(shù)據(jù)庫,即可以存放xml、json、bson類型系列的數(shù)據(jù)。
這些數(shù)據(jù)具備自述性(self-describing),呈現(xiàn)分層的樹狀數(shù)據(jù)結(jié)構(gòu)。redis可以用hash存放簡單關(guān)系型數(shù)據(jù)。
mongoDB 存放json格式數(shù)據(jù)。沒有事務(wù)控制。數(shù)據(jù)庫(數(shù)據(jù)庫)-----》集合(表)—>文檔(記錄行)—》(域)字段—》索引—》不支持表鏈接查(不能表與表之間鏈接查詢)
適合場景:事件記錄、內(nèi)容管理或者博客平臺,比如評論系統(tǒng)。
mongodb持久化原理
mongodb啟動時會創(chuàng)建一個線程不斷循環(huán)用于從defer隊列中獲取持久化的數(shù)據(jù)寫入到磁盤中。系統(tǒng)時間為90毫秒
MongoDB的特點是什么?
(1)面向文檔(2)高性能(3)高可用(4)易擴展(5)豐富的查詢語言
在哪些情況下使用和不使用NoSQL數(shù)據(jù)庫
NoSQL是非關(guān)系型數(shù)據(jù)庫,NoSQL = Not Only SQL。
關(guān)系型數(shù)據(jù)庫采用的結(jié)構(gòu)化的數(shù)據(jù),NoSQL采用的是鍵值對的方式存儲數(shù)據(jù)。
在處理非結(jié)構(gòu)化/半結(jié)構(gòu)化的大數(shù)據(jù)時;在水平方向上進行擴展時;隨時應(yīng)對動態(tài)增加的數(shù)據(jù)項時可以優(yōu)先考慮使用NoSQL數(shù)據(jù)庫。
在考慮數(shù)據(jù)庫的成熟度;支持;分析和商業(yè)智能;管理及專業(yè)性等問題時,應(yīng)優(yōu)先考慮關(guān)系型數(shù)據(jù)庫。
對redis、memcache、mongoDB 對比
-
性能 都比較高,性能對我們來說應(yīng)該都不是瓶頸 總體來講,TPS(每秒事務(wù)處理量)方面redis和memcache差不多,要大于mongodb -
操作的便利性 memcache數(shù)據(jù)結(jié)構(gòu)單一 redis豐富一些,數(shù)據(jù)操作方面,redis更好一些,較少的網(wǎng)絡(luò)IO次數(shù) mongodb支持豐富的數(shù)據(jù)表達(dá),索引,最類似關(guān)系型數(shù)據(jù)庫,支持的查詢語言非常豐富 -
內(nèi)存空間的大小和數(shù)據(jù)量的大小 redis在2.0版本后增加了自己的VM特性,突破物理內(nèi)存的限制;可以對key value設(shè)置過期時間(類似memcache) memcache可以修改最大可用內(nèi)存,采用LRU算法 mongoDB適合大數(shù)據(jù)量的存儲,依賴操作系統(tǒng)VM做內(nèi)存管理,吃內(nèi)存也比較厲害,服務(wù)不要和別的服務(wù)在一起 -
可用性(單點問題) 對于單點問題, redis,依賴客戶端來實現(xiàn)分布式讀寫;主從復(fù)制時,每次從節(jié)點重新連接主節(jié)點都要依賴整個快照,無增量復(fù)制,因性能和效率問題, 所以單點問題比較復(fù)雜;不支持自動sharding,需要依賴程序設(shè)定一致hash 機制。 一種替代方案是,不用redis本身的復(fù)制機制,采用自己做主動復(fù)制(多份存儲),或者改成增量復(fù)制的方式(需要自己實現(xiàn)),一致性問題和性能的權(quán)衡 Memcache本身沒有數(shù)據(jù)冗余機制,也沒必要;對于故障預(yù)防,采用依賴成熟的hash或者環(huán)狀的算法,解決單點故障引起的抖動問題。 mongoDB支持master-slave,replicaset(內(nèi)部采用paxos選舉算法,自動故障恢復(fù)),auto sharding機制,對客戶端屏蔽了故障轉(zhuǎn)移和切分機制。 -
可靠性(持久化) 對于數(shù)據(jù)持久化和數(shù)據(jù)恢復(fù) redis支持(快照、AOF):依賴快照進行持久化,aof增強了可靠性的同時,對性能有所影響 memcache不支持,通常用在做緩存,提升性能; MongoDB從1.8版本開始采用binlog方式支持持久化的可靠性 -
數(shù)據(jù)一致性(事務(wù)支持) Memcache 在并發(fā)場景下,用cas保證一致性 redis事務(wù)支持比較弱,只能保證事務(wù)中的每個操作連續(xù)執(zhí)行 mongoDB不支持事務(wù) -
、應(yīng)用場景 redis:數(shù)據(jù)量較小的更性能操作和運算上 memcache:用于在動態(tài)系統(tǒng)中減少數(shù)據(jù)庫負(fù)載,提升性能;做緩存,提高性能(適合讀多寫少,對于數(shù)據(jù)量比較大,可以采用sharding) MongoDB:主要解決海量數(shù)據(jù)的訪問效率問題
開發(fā)問題
安裝配置
- 安裝mongodbdb,不要安裝有中文的目錄。
- 配置存儲數(shù)據(jù)的目錄data和日志文件夾log(需要手動設(shè)置)。
- 在mongo。conf文件中配置上面創(chuàng)建的文件夾
- 點擊mongod.exe啟動數(shù)據(jù)庫(正常安裝之后就會在電腦上注冊啟動了)
連接mongodb
mongodb的使用方式是客戶服務(wù)器模式,即使用一個客戶端連接mongodb數(shù)據(jù)庫(服務(wù)端)。 1、 命令格式
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?
options]]
mongodb:// 固定前綴 username:賬號,可不填 password:密碼,可不填 host:主機名或ip地址,只有host主機名為必填項。 port:端口,可不填,默認(rèn)27017 /database:連接某一個數(shù)據(jù)庫 ?options:連接參數(shù),key/value對 例子:
mongodb://localhost 連接本地數(shù)據(jù)庫27017端口
mongodb://root:itcast@localhost 使用用戶名root密碼為itcast連接本地數(shù)據(jù)庫27017端口
mongodb://localhost,localhost:27018,localhost:27019,連接三臺主從服務(wù)器,端口為27017、27018、27019
2、使用mongodb自帶的javascript shell(mongo.exe)連接 3、使用studio3T連接 4、使用java程序連接 詳細(xì)參數(shù):http://mongodb./mongo-java-driver/3.4/driver/tutorials/connect-to-mongodb/ 添加依賴:
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo‐java‐driver</artifactId>
<version>3.4.3</version>
</dependency>
。
@Test
public void testConnection(){
//創(chuàng)建mongodb 客戶端
MongoClient mongoClient = new MongoClient( "localhost" , 27017 );
//或者采用連接字符串
//MongoClientURI connectionString = new MongoClientURI("mongodb://root:root@localhost:27017");
//MongoClient mongoClient = new MongoClient(connectionString);
//連接數(shù)據(jù)庫
MongoDatabase database = mongoClient.getDatabase("test");
// 連接collection
MongoCollection<Document> collection = database.getCollection("student");
//查詢第一個文檔
Document myDoc = collection.find().first();
//得到文件內(nèi)容 json串
String json = myDoc.toJson();
System.out.println(json);
}
數(shù)據(jù)庫操作語句
查詢數(shù)據(jù)庫
show dbs 查詢?nèi)繑?shù)據(jù)庫 db 顯示當(dāng)前數(shù)據(jù)庫
創(chuàng)建數(shù)據(jù)庫
命令格式:use DATABASE_NAME
例子: use test02 有test02數(shù)據(jù)庫則切換到此數(shù)據(jù)庫,沒有則創(chuàng)建。 注意: 新創(chuàng)建的數(shù)據(jù)庫不顯示,需要至少包括一個集合。
刪除數(shù)據(jù)庫(慎用?。。。?/h4>
命令格式:db.dropDatabase() 例子: 刪除test02數(shù)據(jù)庫 先切換數(shù)據(jù)庫:use test02 再執(zhí)行刪除:db.dropDatabase()
創(chuàng)建集合
db.createCollection(name, options)
name: 新創(chuàng)建的集合名稱
options: 創(chuàng)建參數(shù)
刪除集合
db.collection.drop()
例子:db.student.drop() 刪除student集合
插入文檔
mongodb中文檔的格式是json格式,下邊就是一個文檔,包括兩個key:_id主鍵和name
{
"_id" : ObjectId("5b2cc4bfa6a44812707739b5"),
"name" : "黑馬程序員"
}
插入命令:
db.COLLECTION_NAME.insert(document)
每個文檔默認(rèn)以_id作為主鍵,主鍵默認(rèn)類型為ObjectId(對象類型),mongodb會自動生成主鍵值。 例子:
db.student.insert({"name":"黑馬程序員","age":10})
注意:同一個集合中的文檔的key可以不相同!但是建議設(shè)置為相同的。
更新文檔
db.collection.update(
<query>,
<update>,
<options>
)
query:查詢條件,相當(dāng)于sql語句的where
update:更新文檔內(nèi)容
options:選項
1、替換文檔 將符合條件 “name”:"北京黑馬程序"的第一個文檔替換為{“name”:“北京黑馬程序員”,“age”:10}。
db.student.update({"name":"黑馬程序員"},{"name":"北京黑馬程序員","age":10})
2、
s
e
t
修
改
器
使
用
set修改器 使用
set修改器使用set修改器指定要更新的key,key不存在則創(chuàng)建,存在則更新。 將符合條件 “name”:"北京黑馬程序"的所有文檔更新name和age的值。
db.student.update({"name":"黑馬程序員"},{$set:{"name":"北京黑馬程序員","age":10}},{multi:true})
multi:false表示更新第一個匹配的文檔,true表示更新所有匹配的文檔。
刪除文檔
db.student.remove(<query>)
query:刪除條件,相當(dāng)于sql語句中的where
1、刪除所有文檔 db.student.remove({}) 2、刪除符合條件的文檔 db.student.remove({“name”:“黑馬程序員”})
查詢文檔
db.collection.find(query, projection)
query:查詢條件,可不填
projection:投影查詢key,可不填
查詢?nèi)?/p>
db.student.find()
查詢符合條件的記錄 查詢name等為"黑馬程序員"的文檔。
db.student.find({"name":"黑馬程序員"})
投影查詢 只顯示name和age兩個key,_id主鍵不顯示
db.student.find({"name":"黑馬程序員"},{name:1,age:1,_id:0})
數(shù)據(jù)庫操作用戶
創(chuàng)建用戶
創(chuàng)建root用戶,角色為root
use admin
db.createUser(
{
user:"root",
pwd:"123",
roles:[{role:"root",db:"admin"}]
}
)
內(nèi)置角色如下:
- 數(shù)據(jù)庫用戶角色:read、readWrite;
- 數(shù)據(jù)庫管理角色:dbAdmin、dbOwner、userAdmin;
- 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
- 備份恢復(fù)角色:backup、restore;
- 所有數(shù)據(jù)庫角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、
dbAdminAnyDatabase - 超級用戶角色:root
查詢用戶
show users
刪除用戶
刪除test1用戶 db.dropUser(“test1”)
修改用戶
先創(chuàng)建test1用戶:
db.createUser(
{
user:"test1",
pwd:"test1",
roles:[{role:"root",db:"admin"}]
}
)
修改test1用戶的角色為readWriteAnyDatabase
use admin
db.updateUser("test1",{roles:[{role:"readWriteAnyDatabase",db:"admin"}]})
修改密碼
修改 test1用戶的密碼為123
use admin
db.changeUserPassword("test1","123")
Spring Data MongoDB使用
- 根據(jù)mongo集合類型創(chuàng)建實體類
- 創(chuàng)建dao層繼承MongoRepository<實體類名,id類型(String)>
- 在service中注入使用。。。。如果使用分頁查詢需要創(chuàng)建pageable對象,通過Resquest。of()方法創(chuàng)建。
來源:https://www./content-2-839451.html
|