本文分爲如下四塊簡單介紹非關係型數據庫MongoDB:1.MongoDB簡介、2.MongoDB和關係數據庫對比、3.MongoDB基本概念、4.mongo shell的使用以及對MongoDB的增刪改查操做spring
MongoDB是一款基於分佈式文件存儲的數據庫,是一種文檔型數據庫,是介於關係型和非關係型數據庫之間的產品,是最接近關係型數據庫的數據庫。MongoDB中的每一條記錄就是一個文檔,是一個數據結構,由字段和值對組成,字段的值可能其餘文檔,數組,以及文檔數組。通常用做離線數據分析使用,放在內網居多,提供高性能的數據持久化。sql
安裝好MongoDB後咱們開始mongo Shell:在數據庫運行的狀況下進入咱們MongoDB的安裝目錄下的mongo.exe能夠直接打開mongo Shell,shell
db :顯示當前正在使用的數據庫數據庫
use <db> :進行當前使用的數據庫切換json
show dbs :顯示當前全部可用的數據庫數組
要在不切換當前數據庫訪問其餘的數據庫使用 db.getSiblingDB() 方法。springboot
當切換到一個不存在的數據庫在第一次插入數據時會進行數據庫的建立操做數據結構
若是mongo Shell不接受咱們輸入的集合名稱可使用代替語法來代替:好比咱們名稱中包含空格或連字符」-」,或者以數字開始:若咱們想要對集合名稱爲3test的集合進行操做則輸入如下替代語法:分佈式
db[「3test」].find() 或者 db.getCollection(「3test」).find()函數
文檔的數據結構和json基本同樣,所存儲在集合中的數據都是BSON格式(即JSON的一種二進制的存儲格式,又稱Binary JSON)插入文檔使用以下函數:
collection表示集合的名稱,插入時若此名稱集合不存在則會自動建立此集合。若在插入操做中未指定_id字段,MongoDB會自動添加_id字段。
查詢文檔使用find方法:
db.collection.find( <query filter>, <projection> ):其中參數<query filter>是過濾條件,指明返回哪些文檔,<projection> 指明返回文檔的哪些字段,限制了返回數據量。
<query filter>參數的兩種方式<field>:<value>形式和使用查詢操做符<field1>: { <operator1>: <value1> }的形式
指定and條件:在集合users中查找出status等於」A」和age小於30的全部文檔
db.users.find( { status: "A", age: { $lt: 30 } } )
指定or條件:在集合users中查找出全部status等於」A」或者age小於30的全部文檔
db.users.find({
$or: [ { status: "A" }, { age: { $lt: 30 } } ]
})
指定and和or條件:在集合users中查找出status等於」A」而且要麼age小於30要麼type等於1的全部文檔
db.users.find({
status: "A",
$or: [ { age: { $lt: 30 } }, { type: 1 } ]
})
嵌入文檔查詢:
嵌入文檔上的精確匹配:從users集合中查找出全部favorities字段只以該種順序且只包含artist等於"Picasso"和food等於 "pizza"的全部內嵌文檔
db.users.find( { favorites: { artist: "Picasso", food: "pizza" } } )
嵌入文檔中字段等於匹配:查詢全部favorities字段中含有artist等於"Picasso"(這裏可能含有其餘的字段)的內嵌文檔
db.users.find( { "favorites.artist": "Picasso" } )
數組上的查詢:(相似於嵌套文檔的查詢)
數組上的精確匹配:查詢出全部badges字段是一個正好只有有"blue", "black" 這兩個這種順序的元素的數組的全部文檔
db.users.find( { badges: [ "blue", "black" ] } )
匹配一個數組元素:查找users集合中badges字段數組中包含」black」元素(可能包含其餘元素)的全部文檔
db.users.find( { badges: "black" } )
匹配數組中指定的元素:查找出users集合中badges數組的第一個元素等於」black」的全部文檔
db.users.find( { "badges.0": "black" } )
指定數組元素多個查詢條件:單個數組元素知足查詢條件須要使用$elemMatch:查找出集合users中finished數組中至少有一個元素大於15而且小於20的全部文檔
db.users.find( { finished: { $elemMatch: { $gt: 15, $lt: 20 } } } )
元素組合知足條件:查找出users集合中一個元素大於15的同時另外一個元素小於20或者有一個元素同時知足大於15小於20的全部的文檔
db.users.find( { finished: { $gt: 15, $lt: 20 } } )
嵌入文檔數組查詢:
使用數組索引匹配嵌入文檔中的字段:查找出points數組第一個文檔元素中的points字段小於等於55的全部文檔
db.users.find( { 'points.0.points': { $lte: 55 } } )
不指定索引匹配字段:查找出points數組中至少有一個嵌入文檔的points字段小於或等於55的全部文檔。
db.users.find( { 'points.points': { $lte: 55 } } )
指定數組文檔的多個查詢條件:
單個元素知足查詢條件(使用$elemMatch):查詢users集合中points數組中至少有一個內嵌文檔的points字段小於等於70而且bonus等於20的全部文檔
db.users.find( { points: { $elemMatch: { points: { $lte: 70 }, bonus: 20 } } } )
元素組合知足查詢條件:查詢users集合中points數組中的一個內嵌文檔的points字段小於等於70而且同時另外一個內嵌文檔的bonus等於20或者有一個內嵌文檔同時知足以上兩個條件的全部文檔。
db.users.find( { "points.points": { $lte: 70 }, "points.bonus": 20 } )
查找爲null或者不存在的字段:
不能使用db.users.find( { name: null } ),這樣會同時返回name字段等於null和不存在name字段的全部文檔
使用類型篩查查找爲null的文檔:db.users.find( { name : { $type: 10 } } ) => 只查找name字段爲null的全部文檔
使用存在性篩查不存在字段的全部文檔:db.users.find( { name : { $exists: false } } ) =>查找出不存在name字段的全部文檔
==========================================================================================
上面講完了查詢的匹配條件,接下來是查詢結果映射:也就是find函數第二個參數的意義
返回查詢的映射字段:上面咱們查詢方法中的 <projection>文檔,映射文檔用來指明返回結果中包括和排除哪些字段,下面是<projection>文檔(find方法的第二個參數)
{ field1: <value>, field2: <value> ... }
其中field字段名稱,<value>的值爲1或true表示在返回的文檔中包含此字段,<value>的值爲0或者false則返回的文檔中不會包含此字段。若不顯示指明_id的顯示或隱藏則會默認返回文檔中會包含_id字段,一個<projection>文檔不能同時指定包括和排除的字段,除了排除_id字段,在顯式包括字段的映射中_id字段是惟一一個能夠顯式排除的字段。
1. 查詢返回users集合中status值爲」A」的全部文檔包含文檔的全部字段
(1) db.users.find( { status: "A" } )
2. 在查詢的結果集中只返回匹配文檔的name,status以及默認的_id字段,同時也能夠顯式排除_id字段
(1) db.users.find( { status: "A" }, { name: 1, status: 1 } )
(2) db.users.find( { status: "A" }, { name: 1, status: 1, _id: 0 } )
3. 返回排除字段以外的全部的字段:返回favorites,points字段外全部字段
(1) db.users.find( { status: "A" }, { favorites: 0, points: 0 } )
4. 返回嵌入文檔中指定字段和排除嵌入文檔中的字段:(1)返回_id,status,name,和嵌入文檔favorites中的food字段food字段仍然在嵌入文檔favorites中。(2)返回排除嵌入文檔favorites中food外的全部字段
(1) db.users.find({ status: "A" },{ name: 1, status: 1, "favorites.food": 1 })
(2) db.users.find({ status: "A" },{ "favorites.food": 0 })
5. 映射數組中的嵌入文檔:返回name,status字段以及points數組文檔中包含bonus字段的文檔
(1) db.users.find( { status: "A" }, { name: 1, status: 1, "points.bonus": 1 } )
6. 映射返回數組中特定的數組元素:MongoDB包含下面映射操做符$elemMatch,$slice,以及$,他們是用來返回指定防範會數組中包含映射元素的惟一方式,不能使用數組索引來映射指定元素
==========================================================================================
上面的更新方法傳入的參數以下:
(1) 過濾條件文檔:相似於sql的where,決定更些哪些文檔
(2) 更新文檔:相似於sql的set,指定要執行的修改或替換文檔
(3) 選項文檔:若包含upsert:true,當沒有匹配到文檔則會建立一個新文檔並插入字段
更新文檔中指定的字段:
使用$set操做符更新favorites.artist字段爲"Pisanello",更新type字段值爲3.
使用$currentDate 操做符更新 lastModified 字段的值到當前日期。若是 lastModified 字段不存在, $currentDate 會建立該字段。下面若使用updateOne函數則只會更新匹配獲得的第一個文檔
db.users.updateMany(
{ "favorites.artist": "Picasso" },
{
$set: { "favorites.artist": "Pisanello", type: 3 },
$currentDate: { lastModified: true }
}
)
若使用update函數來進行更新操做,則須要在選項文檔中添加multi:true來指定更新單條仍是全部的數據,默認更新單條數據
db.users.update(
{ "favorites.artist": "Pisanello" },
{
$set: { "favorites.food": "pizza", type: 0, },
$currentDate: { lastModified: true }
},
{ multi: true }
)
使用replaceOne函數進行替換操做:將name爲abc匹配到的第一個文檔替換爲新文檔
db.users.replaceOne(
{ name: "abc" },
{ name: "amy", age: 34, type: 2, status: "P", favorites: { "artist": "Dali", food: "donuts" } }
)
若update函數不使用操做符則會執行替換操做
db.users.update(
{ name: "xyz" },
{ name: "mee", age: 25, type: 1, status: "A", favorites: { "artist": "Mati", food: "ma" } }
)
注意:替換文檔能夠不一樣於原文檔的字段。在替換文檔中因爲_id字段是不變的因此能夠省略_id字段,若包含,則值必須和當前值相同
==========================================================================================
上面的過濾參數和查詢的時候相同,remove方法將<justone>參數設置爲1來刪除匹配到的第一個文檔,默認會刪除全部匹配到的文檔
MongoDB入門教程到此結束,接下來會有MongoDB和springboot項目的集成使用案例