Mongodb的知識點整理(一)

來源:互聯網
上載者:User

標籤:ref   timestamp   解壓   amp   通過   自動   解決   c++語言   物理   

簡介

  • MongoDB 是一個基於分布式 檔案儲存體的NoSQL資料庫
  • 由C++語言編寫,運行穩定,效能高
  • 旨在為 WEB 應用提供可擴充的高效能資料儲存解決方案
  • 查看官方網站

MongoDB特點

  • 模式自由 :可以把不同結構的文檔儲存在同一個資料庫裡
  • 面向集合的儲存:適合儲存 JSON風格檔案的形式
  • 完整的索引支援:對任何屬性可索引
  • 複製和高可用性:支援伺服器之間的資料複製,支援主-從模式及伺服器之間的相互複製。複製的主要目的是提供冗餘及自動容錯移轉
  • 自動分區:支援雲層級的伸縮性:自動分區功能支援水平的資料庫叢集,可動態添加額外的機器
  • 豐富的查詢:支援豐富的查詢表達方式,查詢指令使用JSON形式的標記,可輕易查詢文檔中的內嵌的對象及數組
  • 快速就地更新:查詢最佳化工具會分析查詢運算式,並產生一個高效的查詢計劃
  • 高效的傳統儲存方式:支援位元據及大型物件(如照片或圖片)

基本操作

  • MongoDB將資料存放區為一個文檔,資料結構由索引值(key=>value)對組成
  • MongoDB文檔類似於JSON對象,欄位值可以包含其他文檔、數組、文檔數組
  • 安裝管理mongodb環境
  • 完成資料庫、集合的管理
  • 資料的增加、修改、刪除、查詢

名詞

SQL術語/概念

MongoDB術語/概念

解釋/說明

database

database

資料庫

table

collection

資料庫表/集合

row

document

資料記錄行/文檔

column

field

資料欄位/域

index

index

索引

table joins

 

表串連,MongoDB不支援

primary key

primary key

主鍵,MongoDB自動將_id欄位設定為主鍵

  • 三元素:資料庫,集合,文檔
  • 集合就是關聯式資料庫中的表
  • 文檔對應著關聯式資料庫中的行
  • 文檔,就是一個對象,由索引值對構成,是json的擴充Bson形式

{‘name‘:‘guojing‘,‘gender‘:‘男‘}

  • 集合:類似於關聯式資料庫中的表,儲存多個文檔,結構不固定,如可以儲存如下文檔在一個集合中

{‘name‘:‘guojing‘,‘gender‘:‘男‘}

{‘name‘:‘huangrong‘,‘age‘:18}

{‘book‘:‘shuihuzhuan‘,‘heros‘:‘108‘}

  • 資料庫:是一個集合的物理容器,一個資料庫中可以包含多個文檔
  • 一個伺服器通常有多個資料庫
  • 下載mongodb的版本,兩點注意
  • 根據業界規則,偶數為穩定版,如1.6.X,奇數為開發版,如1.7.X
  • 32bit的mongodb最大隻能存放2G的資料,64bit就沒有限制
  • 到官網,選擇合適的版本下載
  • 解壓
安裝

tar -zxvf mongodb-linux-x86_64-ubuntu1604-3.4.0.tgz

  • 移動到/usr/local/目錄下

sudo mv -r mongodb-linux-x86_64-ubuntu1604-3.4.0/ /usr/local/mongodb

  • 將可執行檔添加到PATH路徑中

export PATH=/usr/local/mongodb/bin:$PATH

管理mongo

  • 設定檔在/etc/mongod.conf
  • 預設連接埠27017
  • 啟動

sudo service mongod start

  • 停止

sudo service mongod stop

  • 使用終端串連
  • 這個shell就是mongodb的用戶端,同時也是一個js的編譯器

mongo

  • 命令

db查看當前資料庫名稱

db.stats()查看當前資料庫資訊

  • 終端退出串連

exit

或ctrl+c

  • GUI:robomongo,解壓後在bin目錄下找到運行程式
  • 介面如下:

 

 

資料庫切換

  • 查看當前資料庫名稱

db

  • 查看所有資料庫名稱
  • 列出所有在物理上存在的資料庫

show dbs

  • 切換資料庫
  • 如果資料庫不存在,則指向資料庫,但不建立,直到插入資料或建立集合時資料庫才被建立

use 資料庫名稱

  • 預設的資料庫為test,如果你沒有建立新的資料庫,集合將存放在test資料庫中

資料庫刪除

  • 刪除當前指向的資料庫
  • 如果資料庫不存在,則什麼也不做

db.dropDatabase()

集合建立

  • 文法

db.createCollection(name, options)

  • name是要建立的集合的名稱
  • options是一個文檔,用於指定集合的配置
  • 選項??參數是可選的,所以只需要到指定的集合名稱。以下是可以使用的選項列表:
  • 例1:不限制集合大小

db.createCollection("stu")

  • 例2:限制集合大小,後面學會插入語句後可以查看效果
  • 參數capped:預設值為false表示不設定上限,值為true表示設定上限
  • 參數size:當capped值為true時,需要指定此參數,表示上限大小,當文檔達到上限時,會將之前的資料覆蓋,單位為位元組

db.createCollection("sub", { capped : true, size : 10 } )

查看當前資料庫的集合

  • 文法

show collections

刪除

  • 文法

db.集合名稱.drop()

資料類型

  • 下表為MongoDB中常用的幾種資料類型:
  • Object ID:文檔ID
  • String:字串,最常用,必須是有效UTF-8
  • Boolean:儲存一個布爾值,true或false
  • Integer:整數可以是32位或64位,這取決於伺服器
  • Double:儲存浮點值
  • Arrays:數組或列表,多個值儲存到一個鍵
  • Object:用於嵌入式的文檔,即一個值為一個文檔
  • Null:儲存Null值
  • Timestamp:時間戳記
  • Date:儲存當前日期或時間的UNIX時間格式

object id

  • 每個文檔都有一個屬性,為_id,保證每個文檔的唯一性
  • 可以自己去設定_id插入文檔
  • 如果沒有提供,那麼MongoDB為每個文檔提供了一個獨特的_id,類型為objectID
  • objectID是一個12位元組的十六進位數
  • 前4個位元組為目前時間戳
  • 接下來3個位元組的機器ID
  • 接下來的2個位元組中MongoDB的服務進程id
  • 最後3個位元組是簡單的增量值

插入

  • 文法

db.集合名稱.insert(document)

  • 插入文檔時,如果不指定_id參數,MongoDB會為文檔分配一個唯一的ObjectId
  • 例1

db.stu.insert({name:‘gj‘,gender:1})

  • 例2

s1={_id:‘20160101‘,name:‘hr‘}

s1.gender=0

db.stu.insert(s1)

簡單查詢

  • 文法

db.集合名稱.find()

更新

  • 文法

db.集合名稱.update(

   <query>,

   <update>,

   {multi: <boolean>}

)

  • 參數query:查詢條件,類似sql語句update中where部分
  • 參數update:更新操作符,類似sql語句update中set部分
  • 參數multi:可選,預設是false,表示只更新找到的第一條記錄,值為true表示把滿足條件的文檔全部更新
  • 例3:全文檔更新

db.stu.update({name:‘hr‘},{name:‘mnc‘})

  • 例4:指定屬性更新,通過操作符$set

db.stu.insert({name:‘hr‘,gender:0})

db.stu.update({name:‘hr‘},{$set:{name:‘hys‘}})

  • 例5:修改多條匹配到的資料

db.stu.update({},{$set:{gender:0}},{multi:true})

儲存

  • 文法

db.集合名稱.save(document)

  • 如果文檔的_id已經存在則修改,如果文檔的_id不存在則添加
  • 例6

db.stu.save({_id:‘20160102‘,‘name‘:‘yk‘,gender:1})

  • 例7

db.stu.save({_id:‘20160102‘,‘name‘:‘wyk‘})

刪除

  • 文法

db.集合名稱.remove(

   <query>,

   {

     justOne: <boolean>

   }

)

  • 參數query:可選,刪除的文檔的條件
  • 參數justOne:可選,如果設為true或1,則只刪除一條,預設false,表示刪除多條
  • 例8:只刪除匹配到的第一條

db.stu.remove({gender:0},{justOne:true})

  • 例9:全部刪除

db.stu.remove({})

關於size的樣本

  • 例10
  • 建立集合

db.createCollection(‘sub‘,{capped:true,size:10})

  • 插入第一條資料庫查詢

db.sub.insert({title:‘linux‘,count:10})

db.sub.find()

  • 插入第二條資料庫查詢

db.sub.insert({title:‘web‘,count:15})

db.sub.find()

  • 插入第三條資料庫查詢

db.sub.insert({title:‘sql‘,count:8})

db.sub.find()

  • 插入第四條資料庫查詢

db.sub.insert({title:‘django‘,count:12})

db.sub.find()

  • 插入第五條資料庫查詢

db.sub.insert({title:‘python‘,count:14})

db.sub.find()

資料查詢

基本查詢

  • 方法find():查詢

db.集合名稱.find({條件文檔})

  • 方法findOne():查詢,只返回第一個

db.集合名稱.findOne({條件文檔})

  • 方法pretty():將結果格式化

db.集合名稱.find({條件文檔}).pretty()

比較子

  • 等於,預設是等於判斷,沒有運算子
  • 小於$lt
  • 小於或等於$lte
  • 大於$gt
  • 大於或等於$gte
  • 不等於$ne
  • 例1:查詢名稱等於‘gj‘的學生

db.stu.find({name:‘gj‘})

  • 例2:查詢年齡大於或等於18的學生

db.stu.find({age:{$gte:18}})

邏輯運算子

  • 查詢時可以有多個條件,多個條件之間需要通過邏輯運算子串連
  • 邏輯與:預設是邏輯與的關係
  • 例3:查詢年齡大於或等於18,並且性別為1的學生

db.stu.find({age:{$gte:18},gender:1})

  • 邏輯或:使用$or
  • 例4:查詢年齡大於18,或性別為0的學生

db.stu.find({$or:[{age:{$gt:18}},{gender:1}]})

  • and和or一起使用
  • 例5:查詢年齡大於18或性別為0的學生,並且學生的姓名為gj

db.stu.find({$or:[{age:{$gte:18}},{gender:1}],name:‘gj‘})

範圍運算子

  • 使用"$in","$nin" 判斷是否在某個範圍內
  • 例6:查詢年齡為18、28的學生

db.stu.find({age:{$in:[18,28]}})

支援Regex

  • 使用//或$regex編寫Regex
  • 例7:查詢姓黃的學生

db.stu.find({name:/^黃/})

db.stu.find({name:{$regex:‘^黃‘}}})

自訂查詢

  • 使用$where後面寫一個函數,返回滿足條件的資料
  • 例7:查詢年齡大於30的學生

db.stu.find({$where:function(){return this.age>20}})

Limit

  • 方法limit():用於讀取指定數量的文檔
  • 文法:

db.集合名稱.find().limit(NUMBER)

  • 參數NUMBER表示要擷取文檔的條數
  • 如果沒有指定參數則顯示集合中的所有文檔
  • 例1:查詢2條學生資訊

db.stu.find().limit(2)

skip

  • 方法skip():用於跳過指定數量的文檔
  • 文法:

db.集合名稱.find().skip(NUMBER)

  • 參數NUMBER表示跳過的記錄條數,預設值為0
  • 例2:查詢從第3條開始的學生資訊

db.stu.find().skip(2)

一起使用

  • 方法limit()和skip()可以一起使用,不分先後順序
  • 建立資料集

for(i=0;i<15;i++){db.t1.insert({_id:i})}

  • 查詢第5至8條資料

db.stu.find().limit(4).skip(5)

db.stu.find().skip(5).limit(4)

投影

  • 在查詢到的返回結果中,只選擇必要的欄位,而不是選擇一個文檔的整個欄位
  • 如:一個文檔有5個欄位,需要顯示只有3個,投影其中3個欄位即可
  • 文法:
  • 參數為欄位與值,值為1表示顯示,值為0不顯示

db.集合名稱.find({},{欄位名稱:1,...})

  • 對於需要顯示的欄位,設定為1即可,不設定即為不顯示
  • 特殊:對於_id列預設是顯示的,如果不顯示需要明確設定為0
  • 例1

db.stu.find({},{name:1,gender:1})

  • 例2

db.stu.find({},{_id:0,name:1,gender:1})

排序

  • 方法sort(),用於對結果集進行排序
  • 文法

db.集合名稱.find().sort({欄位:1,...})

  • 參數1為升序排列
  • 參數-1為降序排列
  • 例1:根據性別降序,再根據年齡升序

db.stu.find().sort({gender:-1,age:1})

統計個數

  • 方法count()用於統計結果集中文檔條數
  • 文法

db.集合名稱.find({條件}).count()

  • 也可以與為

db.集合名稱.count({條件})

  • 例1:統計男生人數

db.stu.find({gender:1}).count()

  • 例2:統計年齡大於20的男生人數

db.stu.count({age:{$gt:20},gender:1})

消除重複

  • 方法distinct()對資料進行去重
  • 文法

db.集合名稱.distinct(‘去重欄位‘,{條件})

  • 例1:尋找年齡大於18的性別(去重)

db.stu.distinct(‘gender‘,{age:{$gt:18}})

 

Mongodb的知識點整理(一)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.