開放網路研討會“MongoDB 基礎”

朋友們,又一課程推出 “數據庫” 明天就要舉行,所以我們舉辦了傳統的公開課,你可以觀看錄音 這裡。 這次我們談論流行的 MongoDB 資料庫:我們研究了一些微妙之處,了解了操作、功能和架構的基礎知識。 我們也談到了一些用戶案例。

開放網路研討會“MongoDB 基礎”

舉辦了網路研討會 伊凡貝爾特,Citymobil 伺服器開發主管。

MongoDB 特性

MongoDB的 是一個開源的以文件為導向的 DBMS,不需要表格模式的描述。 它被歸類為NoSQL並使用BSON(二進位JSON)。 開箱即用,用 C++ 編寫並支援 JavaScript 語法。 沒有 SQL 支援。

MongoDB 擁有許多流行程式語言(C、C++、C#、Go、Java、JavaScript、Perl、PHP、Python、Ruby 等)的驅動程式。 還有其他程式語言的非官方和社群支援的驅動程式。

好吧,讓我們看看有用的基本指令。

因此,要在 Docker 中部署 MongoDB, 我們寫:

docker run -it --rm -p 127.0.0.1:27017:27017 
--name mongo-exp-project mongo
docker exec -it mongo-exp-project mongo

就這樣發生了 客戶端啟動 MongoDB:

開放網路研討會“MongoDB 基礎”

現在我們來寫傳統的 你好世界:

print (“Hello world!”)

開放網路研討會“MongoDB 基礎”

在那之後 - 讓我們開始循環:

開放網路研討會“MongoDB 基礎”

正如你所注意到的,在我們之前 普通JS, MongoDB 是一個成熟的 JavaScript 解譯器.

何時使用 MongoDB?

有一個故事,矽谷的新創公司通常都是一週前打開《HTML for Dummies》這本書的人。 他會選擇哪一個堆疊? 同意,出於顯而易見的原因,當他的瀏覽器中有 JavaScript、Node.js 在伺服器上運行、JavaScript 也在資料庫中運行時,這對他來說非常方便。 這是第一點。

其次,有 很好的表現;很好的績效 Peter Zaitsev,俄羅斯最好的資料庫專家之一。 在其中,Peter 談論了 MySQL 和 MongoDB,特別注意何時以及什麼最好使用。

第三,我想強調一下,MongoDB的特色是好的 可擴展性 - 這是資料庫的關鍵功能之一。 如果您事先不知道負載是什麼,MongoDB 是完美的。 此外,它還支援開箱即用的模式,例如 分片 и 複製,而且這一切都做得相當透明,就是工作起來非常方便。

至於 術語 在 MongoDB 中:

  • 資料庫是資料庫(方案、表格的集合);
  • 在 MongoDB 中有這樣的東西 一個集合 - 這是一個表格和一組文件的類似物,在邏輯上應該連接起來;
  • 文件類似於字串。

資料庫建立和簡單查詢

要建立資料庫,您只需開始使用它:

use learn

開放網路研討會“MongoDB 基礎”

現在讓我們對文檔進行一個小的插入。 例如,假設它是一隻名為 Aurora 的獨角獸:

db.unicorns.insert({name: 'Aurora', gender: 'f', weight: 450})

db - 用於存取資料庫的全域對象,實際上就是「monga」本身。 用於分片 sh,用於複製 - rs.

該物件有哪些指令? db:

開放網路研討會“MongoDB 基礎”

那麼,讓我們回到我們的命令,結果控制台將報告已插入一行:

開放網路研討會“MongoDB 基礎”

unicorns 在一個團隊中 db.unicorns.insert({name: 'Aurora', gender: 'f', weight: 450}) 表示一個集合。 請注意,我們沒有描述或創建該集合,只是簡單地寫了“獨角獸”,做了插入,然後我們就有了一個集合。

這就是我們如何能夠 取得我們所有的收藏:

db.getCollectionNames()

等等。 能 插入另一個 收藏:

開放網路研討會“MongoDB 基礎”

現在我們問一下 完整收藏 (我們提醒您,在我們的例子中,資料庫已經包含兩個同名獨角獸的資訊):

db.unicorns.find()

請注意,這是我們的 JSON(有姓名、性別、體重、一些唯一的物件識別碼):

開放網路研討會“MongoDB 基礎”

現在讓我們再插入幾個同名的獨角獸:

db.unicorns.insert({name: 'Leto', gender: 'm', 
home: 'Arrakeen', worm: false}) 
db.unicorns.insert({name: 'Leto', gender: 'm', 
home: 'Arrakeen', worm: false})

讓我們看看發生了什麼:

開放網路研討會“MongoDB 基礎”

如您所見,我們還有其他欄位: 首頁 и 蠕蟲,這是極光所沒有的。

讓我們再補充一些獨角獸:

db.unicorns.insertMany([{name: 'Horny', dob: new Date(1992,2,13,7,47), loves: ['carrot','papaya'], weight: 600, gender: 'm', vampires: 63}, 
{name: 'Aurora', dob: new Date(1991, 0, 24, 13, 0), loves: ['carrot', 'grape'], weight: 450, gender: 'f', vampires: 43}, 
{name: 'Unicrom', dob: new Date(1973, 1, 9, 22, 10), loves: ['energon', 'redbull'], weight: 984, gender: 'm', vampires: 182}, 
{name: 'Roooooodles', dob: new Date(1979, 7, 18, 18, 44), loves: ['apple'], weight: 575, gender: 'm', vampires: 99}])

因此,我們使用 JavaScript 插入了另外四個物件:

開放網路研討會“MongoDB 基礎”

您認為在哪個資料庫中儲存護照資料更方便:關係資料庫還是 Mongo?

答案是顯而易見的——在 Monga 中,上面的例子很好地說明了這一點。 KLADR 在俄羅斯聯邦是一個痛苦,這已不是什麼秘密。 Monga 非常適合地址,因為你可以將所有內容設定為數組,生活會輕鬆得多。 這是一個很好的 MongoDB 使用者案例.

讓我們加入更多獨角獸:

db.unicorns.insert({name: 'Solnara', dob: new Date(1985, 6, 4, 2, 1), loves:['apple', 'carrot', 'chocolate'], weight:550, gender:'f', vampires:80}); 
db.unicorns.insert({name:'Ayna', dob: new Date(1998, 2, 7, 8, 30), loves: ['strawberry', 'lemon'], weight: 733, gender: 'f', vampires: 40}); 
db.unicorns.insert({name:'Kenny', dob: new Date(1997, 6, 1, 10, 42), loves: ['grape', 'lemon'], weight: 690, gender: 'm', vampires: 39}); 
db.unicorns.insert({name: 'Raleigh', dob: new Date(2005, 4, 3, 0, 57), loves: ['apple', 'sugar'], weight: 421, gender: 'm', vampires: 2}); 
db.unicorns.insert({name: 'Leia', dob: new Date(2001, 9, 8, 14, 53), loves: ['apple', 'watermelon'], weight: 601, gender: 'f', vampires: 33}); 
db.unicorns.insert({name: 'Pilot', dob: new Date(1997, 2, 1, 5, 3), loves: ['apple', 'watermelon'], weight: 650, gender: 'm', vampires: 54}); 
db.unicorns.insert({name: 'Nimue', dob: new Date(1999, 11, 20, 16, 15), loves: ['grape', 'carrot'], weight: 540, gender: 'f'}); 
db.unicorns.insert({name: 'Dunx', dob: new Date(1976, 6, 18, 18, 18), loves: ['grape', 'watermelon'], weight: 704, gender: 'm', vampires: 165});

開放網路研討會“MongoDB 基礎”

現在請注意文件。 作為 多布 我們存儲整個物件。 還有關於獨角獸喜歡什麼的訊息,但並不是每個人都有這些資訊。 所以裡面有謊言 全陣列.

順便說一句,為了更美觀地顯示結果,可以呼叫搜尋命令末尾的方法 .pretty():

開放網路研討會“MongoDB 基礎”

如果您需要獲得 有關最新錯誤的信息,使用以下命令:

db.getLastError()

這可以在每次插入後完成,也可以配置 Write Concern。 最好閱讀有關它的內容 官方文檔,順便說一句,這在 Monga 中提供了非常豐富的資訊。 順便說一句,它也可以在 Habré 上找到 好文章 在這種場合。

讓我們繼續進行更複雜的查詢

查詢精確欄位值:

db.unicorns.find({gender: 'm'})

透過編寫這樣的請求,我們將在控制台輸出中收到所有雄性獨角獸的清單。

你也可以做 一次查詢多個字段:依性別和體重:

開放網路研討會“MongoDB 基礎”

以上,特別注意 $gt 選擇器,它可以讓你繁殖所有體重超過 700 的雄性獨角獸。

你可以檢查 這個領域到底存在嗎?:

db.unicorns.find({vampires: {$exists: false}})

或者像這樣:

db.unicorns.find({'parents.father': {$exists: true}})

下一支隊伍將帶來獨角獸, 名字以字母 A 或 a 開頭:

db.unicorns.find({name: {$regex: "^[Aa]"}})

現在讓我們考慮一下 數組搜尋。 問題#1:此指令將輸出什麼:

db.unicorns.find({loves:'apple'})

沒錯:每個愛蘋果的人。

以下命令將僅傳回包含以下內容的獨角獸數據 只有蘋果和西瓜:

db.unicorns.find({loves:[ "apple", "watermelon" ]})

還有一個命令:

db.unicorns.find({loves:[ "watermelon", "apple" ]})

在我們的例子中,它不會傳回任何內容,因為當我們傳遞一個陣列時,第一個元素與第一個元素進行比較,第二個元素與第二個元素進行比較,依此類推。也是說,數組也必須匹配 按位置 這些值。

這就是它的樣子 使用“OR”運算符搜尋數組:

開放網路研討會“MongoDB 基礎”

下面的例子將向我們展示 使用 $all 運算子進行搜索。 這裡的順序並不重要:

開放網路研討會“MongoDB 基礎”

我們也可以 按數組大小搜尋:

開放網路研討會“MongoDB 基礎”

但是如果我們想找到一個大小大於一的陣列呢? 有一個運營商可以做到這一點 $哪裡,用它你可以寫更複雜的東西:

db.unicorns.find({$where: function() { return this.loves && (this.loves.length > 1) } })

順便說一句,如果你想練習的話, 你在這 帶有命令的檔案。

遊標特性

稍微跑題一下,說一下Monga的特點:

  • find() 和其他操作不回傳資料 - 它們傳回所謂的「遊標」;
  • 事實上,我們看到正在列印的數據是解釋器的工作。

打字 db.unicorns.find 如果不加括號,我們會得到提示:

開放網路研討會“MongoDB 基礎”

我們繼續滿足要求

還有 $in 運算子:

db.unicorns.find({weight: {$in: [650, 704]}})

開放網路研討會“MongoDB 基礎”

現在我們來談談更新。 例如,讓我們更改 Rooooodles 獨角獸的重量:

db.unicorns.update({name: "Roooooodles"}, {weight: 2222})

由於我們的行動,該文件 將徹底更新,並且其中僅保留一個指定欄位:

開放網路研討會“MongoDB 基礎”

也就是說,我們的物件唯一保留的是權重 2222,當然還有 id。

您可以使用以下方法糾正這種情況 $設定:

db.unicorns.update({_id: ObjectId("5da6ea4d9703b8be0089e6db")}, {$set: { "name" : "Roooooodles", "dob" : ISODate("1979-08-18T18:44:00Z"), "loves" : [ "apple" ], "gender" : "m", "vampires" : 99}})

開放網路研討會“MongoDB 基礎”

也是可以的 增量值:

開放網路研討會“MongoDB 基礎”

而且還有 插入 - 更新和插入的組合:

開放網路研討會“MongoDB 基礎”

這是如何完成的 領域選擇:

開放網路研討會“MongoDB 基礎”

開放網路研討會“MongoDB 基礎”

還需要補充幾句話 跳過 и 限制:

開放網路研討會“MongoDB 基礎”

各位同事,就這些了,如果你們想了解詳情的話, 觀看整個視頻。 並且不要忘記留下您的評論!

來源: www.habr.com

添加評論