Mongodb數據庫的基本介紹

mongodb的介紹和安裝

1. nosql的介紹

  • 「NoSQL」⼀詞最先於1998年被⽤於⼀個輕量級的關係數據庫的名字
  • 隨着web2.0的快速發展, NoSQL概念在2009年被提了出來
  • NoSQL在2010年⻛⽣⽔起, 如今國內外衆多⼤⼩⽹站, 如facebook、 google、 淘寶、 京東、 百度等, 都在使⽤nosql開發⾼性能的產品
  • 對於⼀名程序員來說, 使⽤nosql已經成爲⼀條必備技能
  • NoSQL最常⻅的解釋是「non-relational」, 「Not Only SQL」也被不少⼈接受, 指的是⾮關係型的數據庫

2. 關係型和非關係型的介紹

對於關係型數據庫,存儲數據的時候須要提早建表建庫,隨着數據的複雜度愈來愈高,所建的表的數量也愈來愈多;可是非關係型卻不須要.程序員

3. mongodb的優點

  • 易擴展: NoSQL數據庫種類繁多, 可是⼀個共同的特色都是去掉關係數據庫的關係型特性。 數據之間⽆關係, 這樣就⾮常容易擴展
  • ⼤數據量, ⾼性能: NoSQL數據庫都具備⾮常⾼的讀寫性能, 尤爲在⼤數據量下, 一樣表現優秀。 這得益於它的⽆關係性, 數據庫的結構簡單
  • 靈活的數據模型: NoSQL⽆需事先爲要存儲的數據建⽴字段, 隨時能夠存儲⾃定義的數據格式。 ⽽在關係數據庫⾥, 增刪字段是⼀件⾮常麻煩的事情。 若是是⾮常⼤數據量的表, 增長字段簡直就是⼀個噩夢

4. mongodb的安裝

4.1 命令安裝

sudo apt-get install -y mongodb-org

https://docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu/

4.2 源碼安裝

5. mongodb的啓動

5.1 服務端mongodb的啓動

  • 查看幫助:mongod –help
  • 啓動:sudo service mongod start
  • 中止:sudo service mongod stop
  • 重啓:sudo service mongod restart
  • 查看是否啓動成功:ps -ef|grep mongod
  • 配置文件的位置:/etc/mongod.conf,
  • 默認端⼝:27017
  • 日誌的位置:/var/log/mongodb/mongod.log

5.2 客戶端mongo

  • 啓動本地客戶端:mongo
  • 查看幫助:mongo –help
  • 退出:exit或者ctrl+c

5.3 服務端mongodb沒法啓動的解決方法

sudo mongod --config /etc/mongod.conf &

5.4 mongodb的官方文檔

位置:https://docs.mongodb.com/manual/introduction/web

 

mongodb的基本使用

1. mongodb數據庫的命令

  • 查看當前的數據庫:db
  • 查看全部的數據庫:show dbs /show databases
  • 切換數據庫:use db_name
  • 刪除當前的數據庫:db.dropDatabase()

2. mongodb集合的命令

  • 不手動建立集合: 向不存在的集合中第⼀次加⼊數據時, 集合會被建立出來
  • 手動建立結合:
    • db.createCollection(name,options)
    • db.createCollection("stu")
    • db.createCollection("sub", { capped : true, size : 10 } )
    • 參數capped: 默認值爲false表示不設置上限,值爲true表示設置上限
    • 參數size: 當capped值爲true時, 須要指定此參數, 表示上限⼤⼩,當⽂檔達到上限時, 會將以前的數據覆蓋, 單位爲字節
  • 查看集合:show collections
  • 刪除集合:db.集合名稱.drop()

3. mongodb中常見的數據類型

3.1 常見類型

  • Object ID: ⽂檔ID
  • String: 字符串, 最常⽤, 必須是有效的UTF-8
  • Boolean: 存儲⼀個布爾值, true或false
  • Integer: 整數能夠是32位或64位, 這取決於服務器
  • Double: 存儲浮點值
  • Arrays: 數組或列表, 多個值存儲到⼀個鍵
  • Object: ⽤於嵌⼊式的⽂檔, 即⼀個值爲⼀個⽂檔
  • Null: 存儲Null值
  • Timestamp: 時間戳, 表示從1970-1-1到如今的總秒數
  • Date: 存儲當前⽇期或時間的UNIX時間格式

3.2 注意點

  • 建立⽇期語句以下 :參數的格式爲YYYY-MM-DD new Date('2017-12-20')
  • 每一個⽂檔都有⼀個屬性, 爲_id, 保證每一個⽂檔的惟⼀性正則表達式

    能夠⾃⼰去設置_id插⼊⽂檔,若是沒有提供, 那麼MongoDB爲每一個⽂檔提供了⼀個獨特的_id, 類型爲objectIDsql

  • objectID是⼀個12字節的⼗六進制數,每一個字節兩位,一共是24 位的字符串: 前4個字節爲當前時間戳 接下來3個字節的機器ID 接下來的2個字節中MongoDB的服務進程id 最後3個字節是簡單的增量值mongodb

4. mongodb的增刪改查

4.1 mongodb的插入

  • db.集合名稱.insert(document)shell

    db.stu.insert({name:'gj',gender:1})
      db.stu.insert({_id:"20170101",name:'gj',gender:1})

    插⼊⽂檔時, 若是不指定_id參數, MongoDB會爲⽂檔分配⼀個惟⼀的ObjectId數據庫

4.2 mongodb的保存

命令:db.集合名稱.save(document) 若是⽂檔的_id已經存在則修改, 若是⽂檔的_id不存在則添加json

4.3 mongodb的簡單查詢

命令:db.集合名稱.find()ubuntu

4.4 mongodb的更新

命令:db.集合名稱.update(<query> ,<update>,{multi: <boolean>})數組

  • 參數query:查詢條件
  • 參數update:更新操做符
  • 參數multi:可選, 默認是false,表示只更新找到的第⼀條記錄, 值爲true表示把滿⾜條件的⽂檔所有更新
db.stu.update({name:'hr'},{name:'mnc'})   更新一條
db.stu.update({name:'hr'},{$set:{name:'hys'}})    更新一條
db.stu.update({},{$set:{gender:0}},{multi:true})   更新所有

注意:"multi update only works with $ operators"

4.5 mongodb的刪除

命令:db.集合名稱.remove(<query>,{justOne: <boolean>})

  • 參數query:可選,刪除的⽂檔的條件
  • 參數justOne:可選, 若是設爲true或1, 則只刪除⼀條, 默認false, 表示刪除多條

5. mongodb的高級查詢

  • 5.1 數據查詢

  • ⽅法find(): 查詢

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

  • ⽅法findOne():查詢,只返回第⼀個

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

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

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

5.2 比較運算符

可使用如下數據進行練習

{"name" : "郭靖", "hometown" : "蒙古", "age" : 20, "gender" : true }
{"name" : "⻩蓉", "hometown" : "桃花島", "age" : 18, "gender" : false }
{"name" : "華箏", "hometown" : "蒙古", "age" : 18, "gender" : false }
{"name" : "⻩藥師", "hometown" : "桃花島", "age" : 40, "gender" : true }
{"name" : "段譽", "hometown" : "⼤理", "age" : 16, "gender" : true }
{"name" : "段王爺", "hometown" : "⼤理", "age" : 45, "gender" : true }
{"name" : "洪七公", "hometown" : "華⼭", "age" : 18, "gender" : true }
  • 等於: 默認是等於判斷, 沒有運算符
  • ⼩於:$lt (less than)
  • ⼩於等於:$lte (less than equal)
  • ⼤於:$gt (greater than)
  • ⼤於等於:$gte
  • 不等於:$ne

    例如:

    查詢年齡大於18的全部學生
      db.stu.find({age:{$gte:18}})

5.3 邏輯運算符

邏輯運算符主要指與、或邏輯

  • and:在json中寫多個條件便可

    查詢年齡⼤於或等於18, 而且性別爲true的學⽣
      db.stu.find({age:{$gte:18},gender:true})
  • or:使⽤$or, 值爲數組, 數組中每一個元素爲json

    查詢年齡⼤於18, 或性別爲false的學⽣
      db.stu.find({$or:[{age:{$gt:18}},{gender:false}]})
    
      查詢年齡⼤於18或性別爲男⽣, 而且姓名是郭靖
      db.stu.find({$or:[{age:{$gte:18}},{gender:true}],name:'gj'})

5.4 範圍運算符

使⽤$in, $nin 判斷數據是否在某個數組內

查詢年齡爲1八、 28的學⽣
 db.stu.find({age:{$in:[18,28,38]}})

5.5 ⽀持正則表達式

使⽤//或$regex編寫正則表達式

查詢sku以abc開頭的數據
db.products.find({sku:/^abc/})

查詢sku以789結尾的數據
db.products.find({sku:{$regex:'789$'}})
{ "_id" : 100, "sku" : "abc123", "description" : "Single line description." } { "_id" : 101, "sku" : "abc789", "description" : "First line\nSecond line" } { "_id" : 102, "sku" : "xyz456", "description" : "Many spaces before line" } { "_id" : 103, "sku" : "xyz789", "description" : "Multiple\nline description" } 

5.6 skip和limit

  • ⽅法limit(): ⽤於讀取指定數量的⽂檔

    db.集合名稱.find().limit(NUMBER)
      查詢2條學⽣信息
      db.stu.find().limit(2)
  • ⽅法skip(): ⽤於跳過指定數量的⽂檔

    db.集合名稱.find().skip(NUMBER)
      db.stu.find().skip(2)
  • 同時使用

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

    注意:先使用skip在使用limit的效率要高於前者

5.7 自定義查詢*

因爲mongo的shell是一個js的執行環境 使⽤$where後⾯寫⼀個函數, 返回滿⾜條件的數據

查詢年齡⼤於30的學⽣
 db.stu.find({
     $where:function() {
         return this.age>30;}
 })

5.8 投影

在查詢到的返回結果中, 只選擇必要的字段

命令:db.集合名稱.find({},{字段名稱:1,...})

參數爲字段與值, 值爲1表示顯示, 值爲0不顯 特別注意: 對於_id列默認是顯示的, 若是不顯示須要明確設置爲0

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

5.9 排序

⽅法sort(), ⽤於對 集進⾏排序

命令:db.集合名稱.find().sort({字段:1,...})

參數1爲升序排列 參數-1爲降序排列

根據性別降序, 再根據年齡升序
 db.stu.find().sort({gender:-1,age:1})

5.10 統計個數

⽅法count()⽤於統計結果集中⽂檔條數

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

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

5.11 消除重複

⽅法distinct()對數據進⾏去重

命令:db.集合名稱.distinct('去重字段',{條件})

db.stu.distinct('hometown',{age:{$gt:18}})
相關文章
相關標籤/搜索