B1-MongoDB---2021年4月16日 00:11:03

分布式框架中間件總綱

http://www.reibang.com/p/00aa796bb5b8

一缔杉、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ù)組渤早。


image.png

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è)置為主鍵

直觀案例:


image.png

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 }

image.png
(2)對(duì)以上代碼的解釋:

_id組合始花,Objectld是妄讯、id”的默認(rèn)類型。Objectld使用12字節(jié)的存儲(chǔ)空間酷宵,每個(gè)字節(jié)二位十六進(jìn)制數(shù)字亥贸, 是一個(gè)24位的字符串


image.png
  1. 時(shí)間戳:時(shí)間不斷變化的
  2. 機(jī)器:主機(jī)的唯_標(biāo)識(shí)碼。通常是機(jī)器主機(jī)名的散列值浇垦,這樣可以確保不同主機(jī)
    生成不同的Objectld ,不產(chǎn)生沖突炕置。
  3. PID:為了確保在同一臺(tái)機(jī)器上并發(fā)的多個(gè)進(jìn)程產(chǎn)生的Objectld是唯一的,
    所以加上進(jìn)程標(biāo)識(shí)符(PID).
  4. 計(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ī)范


image.png
image.png

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");
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嗤详,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子瓷炮,更是在濱河造成了極大的恐慌葱色,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件娘香,死亡現(xiàn)場(chǎng)離奇詭異苍狰,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)烘绽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門舞痰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人诀姚,你說(shuō)我怎么就攤上這事响牛。” “怎么了赫段?”我有些...
    開(kāi)封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵呀打,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我糯笙,道長(zhǎng)贬丛,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任给涕,我火速辦了婚禮豺憔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘够庙。我一直安慰自己恭应,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布耘眨。 她就那樣靜靜地躺著昼榛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪剔难。 梳的紋絲不亂的頭發(fā)上胆屿,一...
    開(kāi)封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天奥喻,我揣著相機(jī)與錄音,去河邊找鬼非迹。 笑死环鲤,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的憎兽。 我是一名探鬼主播冷离,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼唇兑!你這毒婦竟也來(lái)了酒朵?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤扎附,失蹤者是張志新(化名)和其女友劉穎蔫耽,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體留夜,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡匙铡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了碍粥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鳖眼。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖嚼摩,靈堂內(nèi)的尸體忽然破棺而出钦讳,到底是詐尸還是另有隱情,我是刑警寧澤枕面,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布愿卒,位于F島的核電站,受9級(jí)特大地震影響潮秘,放射性物質(zhì)發(fā)生泄漏琼开。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一枕荞、第九天 我趴在偏房一處隱蔽的房頂上張望柜候。 院中可真熱鬧,春花似錦躏精、人聲如沸渣刷。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)飞主。三九已至,卻和暖如春高诺,著一層夾襖步出監(jiān)牢的瞬間碌识,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工虱而, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留筏餐,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓牡拇,卻偏偏與公主長(zhǎng)得像魁瞪,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子惠呼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354