分布式框架中間件總綱
一缔杉、MongoDB簡(jiǎn)介
1锤躁、NoSQL簡(jiǎn)介
NoSQL(NoSQL = Not Only SQL),意即反SQL運(yùn)動(dòng)或详,指的是非關(guān)系型的數(shù)據(jù)庫(kù)系羞,是一項(xiàng)全新的數(shù)據(jù)庫(kù)革命性運(yùn)動(dòng),早期就有人提出鸭叙,發(fā)展至2009年趨勢(shì)越發(fā)高漲觉啊。NoSQL的擁護(hù)者們提倡運(yùn)用非關(guān)系型的數(shù)據(jù)存儲(chǔ)拣宏,相對(duì)于目前鋪天蓋地的關(guān)系型數(shù)據(jù)庫(kù)運(yùn)用沈贝,這一概念無(wú)疑是一種全新的思維的注入
2、為什幺使用NoSQL :
優(yōu)點(diǎn):
1勋乾、對(duì)數(shù)據(jù)庫(kù)高并發(fā)讀寫宋下。
2、對(duì)海量數(shù)據(jù)的高效率存儲(chǔ)和訪問(wèn)辑莫。
3学歧、對(duì)數(shù)據(jù)庫(kù)的高可擴(kuò)展性和高可用性。
弱點(diǎn):
1各吨、數(shù)據(jù)庫(kù)事務(wù)一致性需求
2枝笨、數(shù)據(jù)庫(kù)的寫實(shí)時(shí)性和讀實(shí)時(shí)性需求
3、對(duì)復(fù)雜的SQL查詢揭蜒,特別是多表關(guān)聯(lián)查詢的需求
3横浑、什么是MongoDB
(1)MongoDB 是由C++語(yǔ)言編寫的,是一個(gè)基于分布式文件存儲(chǔ)的開(kāi)源數(shù)據(jù)庫(kù)系統(tǒng)屉更。
(2)在高負(fù)載的情況下徙融,添加更多的節(jié)點(diǎn),可以保證服務(wù)器性能瑰谜。
(3)MongoDB 旨在為WEB應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案欺冀。
(4)MongoDB 將數(shù)據(jù)存儲(chǔ)為一個(gè)文檔,數(shù)據(jù)結(jié)構(gòu)由鍵值(key=>value)對(duì)組成萨脑。MongoDB 文檔類似于 JSON 對(duì)象隐轩。字段值可以包含其他文檔,數(shù)組及文檔數(shù)組渤早。
4龙助、MongoDB 特點(diǎn)
1、MongoDB 是一個(gè)面向文檔存儲(chǔ)的數(shù)據(jù)庫(kù),操作起來(lái)比較簡(jiǎn)單和容易提鸟。
2军援、你可以在MongoDB記錄中設(shè)置任何屬性的索引 (如:FirstName="Sameer",Address="8 Gandhi Road")來(lái)實(shí)現(xiàn)更快的排序。
3称勋、你可以通過(guò)本地或者網(wǎng)絡(luò)創(chuàng)建數(shù)據(jù)鏡像胸哥,這使得MongoDB有更強(qiáng)的擴(kuò)展性。
4赡鲜、如果負(fù)載的增加(需要更多的存儲(chǔ)空間和更強(qiáng)的處理能力) 空厌,它可以分布在計(jì)算機(jī)網(wǎng)絡(luò)中的其他節(jié)點(diǎn)上這就是所謂的分片。
5银酬、Mongo支持豐富的查詢表達(dá)式嘲更。查詢指令使用JSON形式的標(biāo)記,可輕易查詢文檔中內(nèi)嵌的對(duì)象及數(shù)組揩瞪。
6赋朦、MongoDb 使用update()命令可以實(shí)現(xiàn)替換完成的文檔(數(shù)據(jù))或者一些指定的數(shù)據(jù)字段 。
7李破、Mongodb中的Map/reduce主要是用來(lái)對(duì)數(shù)據(jù)進(jìn)行批量處理和聚合操作宠哄。
8、Map和Reduce嗤攻。Map函數(shù)調(diào)用emit(key,value)遍歷集合中所有的記錄毛嫉,將key與value傳給Reduce函數(shù)進(jìn)行處理。
9妇菱、Map函數(shù)和Reduce函數(shù)是使用Javascript編寫的承粤,并可以通過(guò)db.runCommand或mapreduce命令來(lái)執(zhí)行MapReduce操作。
10闯团、GridFS是MongoDB中的一個(gè)內(nèi)置功能辛臊,可以用于存放大量小文件。
11偷俭、MongoDB允許在服務(wù)端執(zhí)行腳本浪讳,可以用Javascript編寫某個(gè)函數(shù),直接在服務(wù)端執(zhí)行涌萤,也可以把函數(shù)的定義存儲(chǔ)在服務(wù)端淹遵,下次直接調(diào)用即可。
12负溪、MongoDB支持各種編程語(yǔ)言:RUBY透揣,PYTHON屠凶,JAVA涣觉,C++步脓,PHP,C#等多種語(yǔ)言山橄。
13吗氏、MongoDB安裝簡(jiǎn)單红选。
二岭接、學(xué)前準(zhǔn)備
1、安裝mongodb
#拉取鏡像
docker pull mongo:latest
#創(chuàng)建和啟動(dòng)容器
docker run -d --restart=always -p 27017:27017 --name mymongo -v /data/db:/data/db -d mongo
#進(jìn)入容器
docker exec -it mymongo /bin/bash
#使用MongoDB客戶端進(jìn)行操作
mongo
> show dbs #查詢所有的數(shù)據(jù)庫(kù)
admin 0.000GB
config 0.000GB
local 0.000GB
2楔脯、MongoDB 概念解析
SQL術(shù)語(yǔ)/概念 | MongoDB術(shù)語(yǔ)/概念 | 解釋/說(shuō)明 |
---|---|---|
database | database | 數(shù)據(jù)庫(kù) |
table | collection | 數(shù)據(jù)庫(kù)表/集合 |
row | document | 數(shù)據(jù)記錄行/文檔 |
column | field | 數(shù)據(jù)字段/域 |
index | index | 索引 |
table joins | 無(wú) | 表連接,MongoDB不支持 |
primary key | primary key | 主鍵,MongoDB自動(dòng)將_id字段設(shè)置為主鍵 |
直觀案例:
3撩轰、常用命令
一個(gè)mongodb中可以建立多個(gè)數(shù)據(jù)庫(kù)
1、 Help查看命令提示
db.help();
2昧廷、 切換/創(chuàng)建數(shù)據(jù)庫(kù)
use test
如果數(shù)據(jù)庫(kù)不存在堪嫂,則創(chuàng)建數(shù)據(jù)庫(kù),否則切換到指定數(shù)據(jù)庫(kù)
3木柬、 查詢所有數(shù)據(jù)庫(kù)
show dbs;
4皆串、 刪除當(dāng)前使用數(shù)據(jù)庫(kù)
db.dropDatabase();
5、 查看當(dāng)前使用的數(shù)據(jù)庫(kù)
db.getName();
6眉枕、 顯示當(dāng)前db狀態(tài)
db.stats();
7恶复、 當(dāng)前db版本
db.version();
8、 查看當(dāng)前db的鏈接機(jī)器地址
db.getMongo;
4齐遵、文檔
文檔是一組鍵值(key-value)對(duì)(即BSON)寂玲。MongoDB 的文檔不需要設(shè)置相同的字段塔插,并且相同的字段不需要相同的數(shù)據(jù)類型梗摇,這與關(guān)系型數(shù)據(jù)庫(kù)有很大的區(qū)別,也是 MongoDB 非常突出的特點(diǎn)想许。
(1)下表列出了 RDBMS 與 MongoDB 對(duì)應(yīng)的術(shù)語(yǔ):
RDBMS | MongoDB |
---|---|
數(shù)據(jù)庫(kù) | 數(shù)據(jù)庫(kù) |
表格 | 集合 |
行 | 文檔 |
列 | 字段 |
表聯(lián)合 | 嵌入文檔 |
主鍵 | 主鍵 (MongoDB 提供了 key 為 _id ) |
(2)需要注意的是:
1伶授、文檔中的鍵/值對(duì)是有序的。
2流纹、文檔中的值不僅可以是在雙引號(hào)里面的字符串糜烹,還可以是其他幾種數(shù)據(jù)類型(甚至可以是整個(gè)嵌入的文檔)。
3漱凝、MongoDB區(qū)分類型和大小寫疮蹦。
4、MongoDB的文檔不能有重復(fù)的鍵茸炒。
5愕乎、文檔的鍵是字符串。除了少數(shù)例外情況壁公,鍵可以使用任意UTF-8字符感论。
(3)文檔鍵命名規(guī)范:
1、鍵不能含有\(zhòng)0 (空字符)紊册。這個(gè)字符用來(lái)表示鍵的結(jié)尾比肄。
2、.和$有特別的意義,只有在特定環(huán)境下才能使用芳绩。
3掀亥、以下劃線"_"開(kāi)頭的鍵是保留的(不是嚴(yán)格要求的)。
5妥色、集合
(1)集合就是 MongoDB 文檔組铺浇,類似于 RDBMS (關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng):Relational Database Management System)中的表格。
(2)集合存在于數(shù)據(jù)庫(kù)中垛膝,集合沒(méi)有固定的結(jié)構(gòu)鳍侣,這意味著你在對(duì)集合可以插入不同格式和類型的數(shù)據(jù),但通常情況下我們插入集合的數(shù)據(jù)都會(huì)有一定的關(guān)聯(lián)性吼拥。
(3)常用命令:
//
#1倚聚、 創(chuàng)建一個(gè)集合(table)
db.createCollection( "collName");
#2、 得到指定名稱的集合(table )
db.getCollection("user");
6凿可、MongoDB 數(shù)據(jù)類型
下表為MongoDB中常用的幾種數(shù)據(jù)類型:
數(shù)據(jù)類型 | 描述 |
---|---|
String | 字符串惑折。存儲(chǔ)數(shù)據(jù)常用的數(shù)據(jù)類型。在 MongoDB 中枯跑,UTF-8 編碼的字符串才是合法的惨驶。 |
Integer | 整型數(shù)值。用于存儲(chǔ)數(shù)值敛助。根據(jù)你所采用的服務(wù)器粗卜,可分為 32 位或 64 位。 |
Boolean | 布爾值纳击。用于存儲(chǔ)布爾值(真/假)续扔。 |
Double | 雙精度浮點(diǎn)值。用于存儲(chǔ)浮點(diǎn)值焕数。 |
Min/Max keys | 將一個(gè)值與 BSON(二進(jìn)制的 JSON)元素的最低值和最高值相對(duì)比纱昧。 |
Arrays | 用于將數(shù)組或列表或多個(gè)值存儲(chǔ)為一個(gè)鍵。 |
Timestamp | 時(shí)間戳堡赔。記錄文檔修改或添加的具體時(shí)間识脆。 |
Object | 用于內(nèi)嵌文檔。 |
Null | 用于創(chuàng)建空值善已。 |
Symbol | 符號(hào)灼捂。該數(shù)據(jù)類型基本上等同于字符串類型,但不同的是雕拼,它一般用于采用特殊符號(hào)類型的語(yǔ)言纵东。 |
Date | 日期時(shí)間。用 UNIX 時(shí)間格式來(lái)存儲(chǔ)當(dāng)前日期或時(shí)間啥寇。你可以指定自己的日期時(shí)間:創(chuàng)建 Date 對(duì)象偎球,傳入年月日信息洒扎。 |
Object ID | 對(duì)象 ID。用于創(chuàng)建文檔的 ID衰絮。 |
Binary Data | 二進(jìn)制數(shù)據(jù)袍冷。用于存儲(chǔ)二進(jìn)制數(shù)據(jù)。 |
Code | 代碼類型猫牡。用于在文檔中存儲(chǔ) JavaScript 代碼胡诗。 |
Regular expression |
正則表達(dá)式類型。用于存儲(chǔ)正則表達(dá)式淌友。 |
7煌恢、適用場(chǎng)景
(1)適合場(chǎng)景:
1、網(wǎng)站數(shù)據(jù):Mongo非常適合實(shí)時(shí)的插入震庭,更新與查詢瑰抵,并具備網(wǎng)站實(shí)時(shí)數(shù)據(jù)存儲(chǔ)所需的復(fù)制及高度伸縮性。
2器联、緩存:由于性能很高二汛,Mongo也適合作為信息基礎(chǔ)設(shè)施的緩存層。在系統(tǒng)重啟之后拨拓,由M ongo搭建的持久化緩存層可以避免下層的數(shù)據(jù)源過(guò)載肴颊。
3、大尺寸渣磷,低價(jià)值的數(shù)據(jù):使用傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)存儲(chǔ)一些數(shù)據(jù)時(shí)可能會(huì)比較昂貴婿着, 在此之前,很多時(shí)候程序員往往會(huì)選擇傳統(tǒng)的文件進(jìn)行存儲(chǔ)幸海。
4祟身、高伸縮性的場(chǎng)景:Mongo非常適合由數(shù)十或數(shù)百臺(tái)服務(wù)器組成的數(shù)據(jù)庫(kù)奥务。Mongo的路線圖中已經(jīng)包含對(duì)Map Reduce弓摩的內(nèi)置支持物独。
5、用于對(duì)象及 JSON數(shù)據(jù)的存儲(chǔ):Mongo的BSON數(shù)據(jù)格式非常適合文檔化格式的存儲(chǔ) 及查詢氯葬。
(2)不適合場(chǎng)景:
1挡篓、高度事務(wù)性的系統(tǒng):例如銀行或會(huì)計(jì)系統(tǒng)。傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)目前還是更適用于需要大量原子性復(fù)雜事務(wù)的應(yīng)用程序帚称。
2官研、傳統(tǒng)的商業(yè)智能應(yīng)用:針對(duì)特定問(wèn)題的BI數(shù)據(jù)庫(kù)會(huì)對(duì)產(chǎn)生高度優(yōu)化的查詢方式。對(duì)于此類應(yīng)用闯睹,數(shù)據(jù)倉(cāng)庫(kù)可能是更合適的選擇戏羽。
三、MongoBD 實(shí)操入門(增刪改查)
1楼吃、insert 插入
(1)代碼:
> db.User.save({name:'zhangsan',age:21,sex:true})
> db.User.find()
{ "_id" : ObjectId("607850f721ba306a237c2331"), "name" : "zhangsan", "age" : 21, "sex" : true }
(2)對(duì)以上代碼的解釋:
_id組合始花,Objectld是妄讯、id”的默認(rèn)類型。Objectld使用12字節(jié)的存儲(chǔ)空間酷宵,每個(gè)字節(jié)二位十六進(jìn)制數(shù)字亥贸, 是一個(gè)24位的字符串
- 時(shí)間戳:時(shí)間不斷變化的
- 機(jī)器:主機(jī)的唯_標(biāo)識(shí)碼。通常是機(jī)器主機(jī)名的散列值浇垦,這樣可以確保不同主機(jī)
生成不同的Objectld ,不產(chǎn)生沖突炕置。 - PID:為了確保在同一臺(tái)機(jī)器上并發(fā)的多個(gè)進(jìn)程產(chǎn)生的Objectld是唯一的,
所以加上進(jìn)程標(biāo)識(shí)符(PID). - 計(jì)數(shù)器:前9個(gè)字節(jié)保證了同一秒鐘不同機(jī)器不同進(jìn)程產(chǎn)生的Objectld是唯一的男韧。
后3個(gè)字節(jié)就是一個(gè)自動(dòng)增加的計(jì)數(shù)器朴摊,確保相同進(jìn)程同一秒產(chǎn)生的Objectld也是
不一樣。同一秒最多允許每個(gè)進(jìn)程擁有IS 777 2托個(gè)不同的Objectld此虑。
2仍劈、Query 查詢
(1)WHERE (既 sql 的查詢,默認(rèn) * 全部)
//
# select * from User where name = 'zhangsan'
> db.User.find({name:"zhangsan"})
(2)FIELDS (查詢出指定字段 )
//
# select name, age from User where age = 21
> db.User.find({age:21}, {'name':1, 'age':1})
(3)SORT(排序)寡壮,在 MongoDB 中使用 sort() 方法對(duì)數(shù)據(jù)進(jìn)行排序贩疙,sort() 方法可以通過(guò)參數(shù)指定排序的字段,并使用 1 和 -1 來(lái)指定排序的方式况既,其中 1 為升序排列这溅,而 -1 是用于降序排列。
//
# select * from User order by age
> db.User.find().sort({age:1})
(4)SUCE(分頁(yè))棒仍,在 MongoDB 中使用 limit()方法來(lái)讀取指定數(shù)量的數(shù)據(jù)悲靴,skip()方法來(lái)跳過(guò)指定數(shù)量的數(shù)據(jù)
//
# select * from User skip 2 limit 3
> db.User.find().skip(0).limit(3)
(5)IN
//
# select * from User where age in (21, 26, 32)
> db.User.find({age:{$in:[21,26,32]}})
(6)COUNT
//
# select count(*) from User where age >20
> db.User.find({age:{$gt:20}}).count()
(7)OR
//
# select * from User where age = 21 or age = 28
> db.User.find({$or:[{age:21}, {age:28}]})
3、Update 更新
(1)可直接用類似T-SQL條件表達(dá)式更新莫其,或用SaveO更新從數(shù)據(jù)庫(kù)返回到文檔對(duì)象癞尚。
//
# update Userset age = 100, sex = 0 where name = 'user1'
> db.User.update({name:"zhangsan"}, {$set:{age:100, sex:0}})
(2)Update()有幾個(gè)參數(shù)需要注意。
db.collection.update(criteria, objNew, upsert, mult)
criteria:需要更新的條件表達(dá)式
objNew:更新表達(dá)式
upsert:如FI標(biāo)記錄不存在乱陡,是否插入新文檔浇揩。
multi:是否更新多個(gè)文檔。
4憨颠、Remove 刪除
用于刪除單個(gè)或全部文檔胳徽,刪除后的文檔無(wú)法恢復(fù)。
//
# 移除對(duì)應(yīng)id的行
> db.User.remove(id)
# 移除所有
> db.User.remove({})
5爽彤、aggregate(聚合函數(shù))养盗,MongoDB中聚合(aggregate)主要用于處理數(shù)據(jù)(諸如統(tǒng)計(jì)平均值,求和等),并返回計(jì)算后的數(shù)據(jù)結(jié)果适篙。有點(diǎn)類似sql語(yǔ)句中的 count(*)
(1)插入數(shù)據(jù)
>db.article.insert({
title: 'MongoDB Overview',
description: 'MongoDB is no sql database',
by_user: 'runoob.com',
url: 'http://www.runoob.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})
>db.article.insert({
title: 'NoSQL Overview',
description: 'No sql database is very fast',
by_user: 'runoob.com',
url: 'http://www.runoob.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 10
})
>db.article.insert({
title: 'Neo4j Overview',
description: 'Neo4j is no sql database',
by_user: 'Neo4j',
url: 'http://www.neo4j.com',
tags: ['neo4j', 'database', 'NoSQL'],
likes: 750
})
(2)統(tǒng)計(jì)求和 Sum
現(xiàn)在我們通過(guò)以上集合計(jì)算每個(gè)作者所寫的文章數(shù)
//
# select by_user, count(*) from article group by by_user
> db.article.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])
{
"result" : [
{
"_id" : "runoob.com",
"num_tutorial" : 2
},
{
"_id" : "Neo4j",
"num_tutorial" : 1
}
],
"ok" : 1
}
(3)★常見(jiàn)的聚合表達(dá)式:以下 $源碼中作者有轉(zhuǎn)義處理 /
表達(dá)式 | 描述 | 實(shí)例 |
---|---|---|
$sum | 計(jì)算總和往核。 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}]) |
$avg | 計(jì)算平均值 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}]) |
$min | 獲取集合中所有文檔對(duì)應(yīng)值得最小值。 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}]) |
$max | 獲取集合中所有文檔對(duì)應(yīng)值得最大值嚷节。 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}]) |
$push | 在結(jié)果文檔中插入值到一個(gè)數(shù)組中聂儒。 | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}]) |
$addToSet | 在結(jié)果文檔中插入值到一個(gè)數(shù)組中蝶缀,但不創(chuàng)建副本。 | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}]) |
$first | 根據(jù)資源文檔的排序獲取第一個(gè)文檔數(shù)據(jù)薄货。 | db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}]) |
$last | 根據(jù)資源文檔的排序獲取最后一個(gè)文檔數(shù)據(jù) | db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}]) |
(4)索引
索引通常能夠極大的提高查詢的效率翁都,如果沒(méi)有索引,MongoDB在讀取數(shù)據(jù)時(shí)必須掃描集合中的每個(gè)文件并選取那些符合查詢條件的記錄谅猾。
這種掃描全集合的查詢效率是非常低的柄慰,特別在處理大量的數(shù)據(jù)時(shí),查詢可以要花費(fèi)幾十秒甚至幾分鐘税娜,這對(duì)網(wǎng)站的性能是非常致命的坐搔。
索引是特殊的數(shù)據(jù)結(jié)構(gòu),索引存儲(chǔ)在一個(gè)易于遍歷讀取的數(shù)據(jù)集合中敬矩,索引是對(duì)數(shù)據(jù)庫(kù)表中一列或多列的值進(jìn)行排序的一種結(jié)構(gòu)概行。
>db.User.createIndex({"name":1})
語(yǔ)法中 name值為你要?jiǎng)?chuàng)建的索引字段,1 為指定按升序創(chuàng)建索引弧岳,如果你想按降序來(lái)創(chuàng)建索引指定為 -1 即可
四凳忙、Spring boot集成 mongodb
1、集成簡(jiǎn)介
spring-data-mongodb提供了MongoTemplate與MongoRepository兩種方式訪問(wèn)mongodb禽炬,MongoRepository操作簡(jiǎn)單涧卵,MongoTemplate操作靈活,我們?cè)陧?xiàng)目中可以靈活適用這兩種方式操作mongodb腹尖,MongoRepository的缺點(diǎn)是不夠靈活柳恐,MongoTemplate正好可以彌補(bǔ)不足。
2热幔、搭建開(kāi)發(fā)環(huán)境
(1)引入maven 依賴
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.10.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
(2)添加配置:application.properties文件添加配置
spring.data.mongodb.uri=mongodb://47.93.118.241:27017/test
yml:
spring:
data:
mongodb:
uri: mongodb://106.52.23.202:27017/mongodb_test
(3)實(shí)體類:添加com.kk.mongodb.entity.User類
@Data
@Document("User")
public class User {
@Id
private String id;
private String name;
private Integer age;
private String email;
private String createDate;
}
(4)實(shí)現(xiàn)常用方法
A.常用方法
mongoTemplate.findAll(User.class): 查詢User文檔的全部數(shù)據(jù)
mongoTemplate.findById(<id>, User.class): 查詢User文檔id為id的數(shù)據(jù)
mongoTemplate.find(query, User.class);: 根據(jù)query內(nèi)的查詢條件查詢
mongoTemplate.upsert(query, update, User.class): 修改
mongoTemplate.remove(query, User.class): 刪除
mongoTemplate.insert(User): 新增
B.Query對(duì)象
1乐设、創(chuàng)建一個(gè)query對(duì)象(用來(lái)封裝所有條件對(duì)象),再創(chuàng)建一個(gè)criteria對(duì)象(用來(lái)構(gòu)建條件)
2绎巨、 精準(zhǔn)條件:criteria.and(“key”).is(“條件”)
模糊條件:criteria.and(“key”).regex(“條件”)
3近尚、封裝條件:query.addCriteria(criteria)
4、大于(創(chuàng)建新的criteria):Criteria gt = Criteria.where(“key”).gt(“條件”)
小于(創(chuàng)建新的criteria):Criteria lt = Criteria.where(“key”).lt(“條件”)
5认烁、Query.addCriteria(new Criteria().andOperator(gt,lt));
6肿男、一個(gè)query中只能有一個(gè)andOperator()。其參數(shù)也可以是Criteria數(shù)組却嗡。
7、排序 :query.with(new Sort(Sort.Direction.ASC, "age"). and(new Sort(Sort.Direction.DESC, "date")))
(5)添加測(cè)試類:在/test/java下面添加測(cè)試類:
@SpringBootTest
class DemomogoApplicationTests {
@Autowired
private MongoTemplate mongoTemplate;
//添加
@Test
public void createUser() {
User user = new User();
user.setAge(20);
user.setName("test");
user.setEmail("4932200@qq.com");
User user1 = mongoTemplate.insert(user);
System.out.println(user1);
}
//查詢所有
@Test
public void findUser() {
List<User> userList = mongoTemplate.findAll(User.class);
System.out.println(userList);
}
//根據(jù)id查詢
@Test
public void getById() {
User user =
mongoTemplate.findById("5ffbfa2ac290f356edf9b5aa", User.class);
System.out.println(user);
}
//條件查詢
@Test
public void findUserList() {
Query query = new Query(Criteria
.where("name").is("test")
.and("age").is(20));
List<User> userList = mongoTemplate.find(query, User.class);
System.out.println(userList);
}
//模糊查詢
@Test
public void findUsersLikeName() {
String name = "est";
String regex = String.format("%s%s%s", "^.*", name, ".*$");
Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
Query query = new Query(Criteria.where("name").regex(pattern));
List<User> userList = mongoTemplate.find(query, User.class);
System.out.println(userList);
}
//分頁(yè)查詢
@Test
public void findUsersPage() {
String name = "est";
int pageNo = 1;
int pageSize = 10;
Query query = new Query();
String regex = String.format("%s%s%s", "^.*", name, ".*$");
Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
query.addCriteria(Criteria.where("name").regex(pattern));
int totalCount = (int) mongoTemplate.count(query, User.class);
List<User> userList = mongoTemplate.find(query.skip((pageNo - 1) * pageSize).limit(pageSize), User.class);
Map<String, Object> pageMap = new HashMap<>();
pageMap.put("list", userList);
pageMap.put("totalCount",totalCount);
System.out.println(pageMap);
}
//修改
@Test
public void updateUser() {
User user = mongoTemplate.findById("5ffbfa2ac290f356edf9b5aa", User.class);
user.setName("test_1");
user.setAge(25);
user.setEmail("493220990@qq.com");
Query query = new Query(Criteria.where("_id").is(user.getId()));
Update update = new Update();
update.set("name", user.getName());
update.set("age", user.getAge());
update.set("email", user.getEmail());
UpdateResult result = mongoTemplate.upsert(query, update, User.class);
long count = result.getModifiedCount();
System.out.println(count);
}
//刪除操作
@Test
public void delete() {
Query query =
new Query(Criteria.where("_id").is("5ffbfa2ac290f356edf9b5aa"));
DeleteResult result = mongoTemplate.remove(query, User.class);
long count = result.getDeletedCount();
System.out.println(count);
}
}
(6)基于MongoRepository開(kāi)發(fā)CRUD
Spring Data提供了對(duì)mongodb數(shù)據(jù)訪問(wèn)的支持嘹承,我們只需要繼承MongoRepository類窗价,按照Spring Data規(guī)范就可以了
SpringData 方法定義規(guī)范
1、不是隨便聲明的叹卷,而需要符合一定的規(guī)范
2撼港、 查詢方法以find | read | get開(kāi)頭
3坪它、 涉及條件查詢時(shí),條件的屬性用條件關(guān)鍵字連接
4帝牡、 要注意的是:條件屬性首字母需要大寫
5往毡、 支持屬性的級(jí)聯(lián)查詢,但若當(dāng)前類有符合條件的屬性則優(yōu)先使用靶溜,而不使用級(jí)聯(lián)屬性,若需要使用級(jí)聯(lián)屬性开瞭,則屬性之間使用_強(qiáng)制進(jìn)行連接
(7)添加Repository類:添加com.kk.mongodb.repository.UserRepository類
package com.kk.mongodb.repository;
import com.kk.mongodb.entity.User;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface UserRepository extends MongoRepository<User, String> {
}
(8)添加測(cè)試類:在/test/java下面添加測(cè)試類:
@SpringBootTest
class DemomogoApplicationTests1 {
@Autowired
private UserRepository userRepository;
//添加
@Test
public void createUser() {
User user = new User();
user.setAge(20);
user.setName("張三");
user.setEmail("3332200@qq.com");
User user1 = userRepository.save(user);
}
//查詢所有
@Test
public void findUser() {
List<User> userList = userRepository.findAll();
System.out.println(userList);
}
//id查詢
@Test
public void getById() {
User user = userRepository.findById("5ffbfe8197f24a07007bd6ce").get();
System.out.println(user);
}
//條件查詢
@Test
public void findUserList() {
User user = new User();
user.setName("張三");
user.setAge(20);
Example<User> userExample = Example.of(user);
List<User> userList = userRepository.findAll(userExample);
System.out.println(userList);
}
//模糊查詢
@Test
public void findUsersLikeName() {
//創(chuàng)建匹配器,即如何使用查詢條件
ExampleMatcher matcher = ExampleMatcher.matching() //構(gòu)建對(duì)象
.withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING) //改變默認(rèn)字符串匹配方式:模糊查詢
.withIgnoreCase(true); //改變默認(rèn)大小寫忽略方式:忽略大小寫
User user = new User();
user.setName("三");
Example<User> userExample = Example.of(user, matcher);
List<User> userList = userRepository.findAll(userExample);
System.out.println(userList);
}
//分頁(yè)查詢
@Test
public void findUsersPage() {
Sort sort = Sort.by(Sort.Direction.DESC, "age");
//0為第一頁(yè)
Pageable pageable = PageRequest.of(0, 10, sort);
//創(chuàng)建匹配器罩息,即如何使用查詢條件
ExampleMatcher matcher = ExampleMatcher.matching() //構(gòu)建對(duì)象
.withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING) //改變默認(rèn)字符串匹配方式:模糊查詢
.withIgnoreCase(true); //改變默認(rèn)大小寫忽略方式:忽略大小寫
User user = new User();
user.setName("三");
Example<User> userExample = Example.of(user, matcher);
//創(chuàng)建實(shí)例
Example<User> example = Example.of(user, matcher);
Page<User> pages = userRepository.findAll(example, pageable);
System.out.println(pages);
}
//修改
@Test
public void updateUser() {
User user = userRepository.findById("5ffbfe8197f24a07007bd6ce").get();
user.setName("張三_1");
user.setAge(25);
user.setEmail("883220990@qq.com");
User save = userRepository.save(user);
System.out.println(save);
}
//刪除
@Test
public void delete() {
userRepository.deleteById("5ffbfe8197f24a07007bd6ce");
}
}