Mongodb數據庫

Mongodb數據庫

一、什麼是數據庫

數據庫(Database)是按照數據結構來組織、存儲和管理數據的倉庫


  • 關係型數據庫(sql):Access mySql SqlServer oracle db2等。
  • 非關係型數據庫( NoSql ): MongoDB,Redis,HBase,CouchDB等。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-NuLVF93a-1571106613728)(en-resource://database/674:1)]
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-eCSuBZ0J-1571106613735)(en-resource://database/676:1)]

非關係型數據庫數據條目其實是bson。bson 是 json 的超集,比如 json 中沒法儲存二進制類型,而 bson 拓展了類型,提供了二進制支持。mongodb 中存儲的一條條記錄都可以用 bson 來表示。所以你也可以認爲,mongodb 是個存 bson 數據的數據庫。

二、NoSQL簡介

  NoSQL,指的是非關係型的數據庫。NoSQL有時也稱作Not Only SQL的縮寫,是對不同於傳統的關型數據庫的數據庫管理系統的統稱。
  NoSQL用於超大規模數據的存儲。(例如谷歌或Facebook每天爲他們的用戶收集萬億比特的數據)。這些類型的數據存儲不需要固定的模式,無需多餘操作就可以橫向擴展。

3.MongoDB簡介

  • MongoDB 是一個基於分佈式文件存儲的數據庫。由 C++ 語言編寫。旨在爲 WEB 應用提供可擴展的高性能數據存儲解決方案。

分佈式算法指的是將一個大型的任務進行分解,將每一個小任務的執行結果組合起來,返回一個整體
好處: 給其他任務提供了可執行的機會

  • MongoDB 是非關係型數據庫當中功能最豐富,最像關係型數據庫的。

三、MongoDB優點

  • 面向集合存儲,易存儲對象類型的數據。
  • 模式自由。
  • 支持動態查詢。
  • 支持完全索引,包含內部對象。
  • 支持查詢。
  • 支持複製和故障恢復。
  • 使用高效的二進制數據存儲,包括大型對象(如視頻等)。
  • 自動處理碎片,以支持雲計算層次的擴展性
  • 支持RUBY,PYTHON,JAVA,C++,PHP等多種語言。
  • 文件存儲格式爲BSON(一種JSON的擴展)

四、BSON

  • BSON是一種類似json的二進制形式的存儲格式,簡稱Binary JSON,它和JSON一樣,支持內嵌的文檔對象和數組對象,但是BSON有JSON沒有的一些數據類型,如Date和BinData類型。

  • BSON可以做爲網絡數據交換的一種存儲形式,這個有點類似於Google的ProtocolBuffer,但是BSON是一種schema【骨架】-less的存儲形式,它的優點是靈活性高,但它的缺點是空間利用率不是很理想。

  • BSON有三個特點:輕量性、可遍歷性、高效性。

五、非關係型數據庫與關係型數據庫區別

非關係型數據庫的優勢:

  1. 性能

NOSQL是基於鍵值對的,可以想象成表中的主鍵和值的對應關係,而且不需要經過SQL層的解析,所以性能非常高。

  1. 可擴展性

同樣也是因爲基於鍵值對,數據之間沒有耦合性,所以非常容易水平擴展。

關係型數據庫的優勢:

  1. 複雜查詢

可以用SQL語句方便的在多個表之間做非常複雜的數據查詢。

  1. 事務支持

使得對於安全性能很高的數據訪問要求得以實現。

總結:
- 數據庫功能是用來存儲數據的。
- 數據庫分爲關係系數據庫和非關係型數據庫(nosql)
- 關係型數據庫是由表和表之間的關係組成的,nosql是由集合組成的,集合下面是很多的文檔
- 非關係型數據庫文件存儲格式爲BSON(一種JSON的擴展)。

六、MongoDB

管理員身份運行cmd

1.啓動MongoDB

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-dX1Unkhz-1571106613739)(en-resource://database/678:1)]
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-pFZgSrO3-1571106613740)(en-resource://database/680:1)]
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-cSGUSc4X-1571106613742)(en-resource://database/682:1)]

2.將MongoDB安裝爲windows服務

> mongod  --storageEngine mmapv1 --dbpath "d:\mongodb\db" --logpath "d:\mongodb\log\MongoDB.log" --install --serviceName "MongoDB"

啓動mongodb服務

> NET START MongoDB

關閉服務和刪除進程

> net stop MongoDB

3.MongoDB基礎使用

  • 查看幫助 >help
> help
        db.help()                    help on db methods
        db.mycoll.help()             help on collection methods
        sh.help()                    sharding helpers
        rs.help()                    replica set helpers
        help admin                   administrative help
        help connect                 connecting to a db help
        help keys                    key shortcuts
        help misc                    misc things to know
        help mr                      mapreduce

        show dbs                     show database names
        show collections             show collections in current database
        show users                   show users in current database
        show profile                 show most recent system.profile entries with time >= 1ms
        show logs                    show the accessible logger names
        show log [name]              prints out the last segment of log in memory, 'global' is default
        use <db_name>                set current database
        db.foo.find()                list objects in collection foo
        db.foo.find( { a : 1 } )     list objects in foo where a == 1
        it                           result of the last line evaluated; use to further iterate
        DBQuery.shellBatchSize = x   set default number of items to display on shell
        exit                         quit the mongo shell
  • 顯示數據庫列表 > show dbs
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
  • 創建數據庫 > use dbname
> use 1908
switched to db 1908
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB

如果數據庫不存在,則創建數據庫dbname,否則切換到指定數據庫dbname。創建的數據庫並不在數據庫的列表中,要顯示它,我們需要向數據庫dbname插入一些數據

> db.webs.save({name:"wang"})
WriteResult({ "nInserted" : 1 })
> show dbs
1908    0.000GB
admin   0.000GB
config  0.000GB
local   0.000GB
  • 顯示數據庫中的集合 show collections
> show collections
students
webs
3.1 增加數據
  • db.webs.save({“name”:“老李”})
> db.students.save({age:"20"})
WriteResult({ "nInserted" : 1 })
  • db.webs.insert({“name”:“ghost”, “age”:10})
> db.student.insert({name:"lisi"})
WriteResult({ "nInserted" : 1 })
  • db.webs.insert({name:‘ssss’,msg:{sex:‘man’,age:10}}) 特殊數據條目包含對象
    注:查詢這個對象中的數據:db.webs.find({‘msg.age’:10})
> db.webs.insert({name:'ssss',sex:'man',obj:{s:'wqehk',g:10}})
WriteResult({ "nInserted" : 1 })
> db.webs.find({'obj.g':10})
{ "_id" : ObjectId("5da4573877f482015bd3759f"), "name" : "ssss", "sex" : "man", "obj" : { "s" : "wqehk", "g" : 10 } }

如果沒有web這個集合,mongodb會自動創建

save()和insert()也存在着些許區別:若新增的數據主鍵已經存在,insert()會不做操作並提示錯誤,而save()則更改原來的內容爲新內容。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-lo2K45LB-1571106613743)(en-resource://database/690:1)]

_id是主鍵,主鍵是每條數據的唯一標識,不能重複,就像身份證是每個人唯一的編號一樣.


3.2 刪除數據
  1. 刪除文檔

    • db.users.remove({}) 刪除users集合下所有數據
    > db.students.remove({})
    WriteResult({ "nRemoved" : 2 })
    
    • db.users.remove({“name”: “lecaf”}) 刪除users集合下name=”lecaf”的數據
    > db.web.remove({name:'lisl'})
    WriteResult({ "nRemoved" : 1 })
    
  2. 刪除集合

    • db.users.drop()或db.runCommand({“drop”:“users”}) 刪除集合users
    > db.students.drop()
    true
    > db.runCommand({"drop":"student"})
    { "nIndexesWas" : 1, "ns" : "1908.student", "ok" : 1 }
    
  3. 刪除數據庫

    • db.runCommand({“dropDatabase”: 1}) 刪除當前數據庫,注意 此處的1沒加雙引號。
    > db.runCommand({"drop":"student"})
    { "nIndexesWas" : 1, "ns" : "1908.student", "ok" : 1 }
    

3.3 查找數據
  • db.users.find() 查找users集合中所有數據
> db.webs.find()
{ "_id" : ObjectId("5da43d8777f482015bd37599"), "name" : "zhangsan", "age" : "18" }
{ "_id" : ObjectId("5da43d9b77f482015bd3759a"), "name" : "lisi", "age" : "20" }
{ "_id" : ObjectId("5da43db377f482015bd3759b"), "name" : "wangwu", "age" : "22" }
  • db.users.findOne() 查找users集合中的第一條數據
> db.webs.findOne()
{
        "_id" : ObjectId("5da43d8777f482015bd37599"),
        "name" : "zhangsan",
        "age" : "18"
}
  • db.users.find().pretty() 格式化查詢到的數據
> db.webs.find().pretty()
{
        "_id" : ObjectId("5da43d8777f482015bd37599"),
        "name" : "zhangsan",
        "age" : "18"
}
{
        "_id" : ObjectId("5da43d9b77f482015bd3759a"),
        "name" : "lisi",
        "age" : "20"
}
{
        "_id" : ObjectId("5da43db377f482015bd3759b"),
        "name" : "wangwu",
        "age" : "22"
}

排序:

  • >db.webs.find().sort({age:-1}) 數據從大到小排序,{age:1}則正序
> db.webs.find().sort({age:-1})
{ "_id" : ObjectId("5da445e077f482015bd3759e"), "name" : "zhangsan", "age" : 30 }
{ "_id" : ObjectId("5da445bc77f482015bd3759d"), "name" : "zhangsan", "age" : 24 }
{ "_id" : ObjectId("5da43f5277f482015bd3759c"), "name" : "zhaoliu", "age" : 22 }
{ "_id" : ObjectId("5da43db377f482015bd3759b"), "name" : "wangwu", "age" : 20 }
{ "_id" : ObjectId("5da43d9b77f482015bd3759a"), "name" : "lisi", "age" : 18 }
{ "_id" : ObjectId("5da43d8777f482015bd37599"), "name" : "zhangsan", "age" : 16 }

條件查詢:

  • >db.webs.find({age:{$gt:10}}) 查詢age大於10的數據
  • >db.webs.find({age:{$gte:10}}) 查詢age大於等於10的數據
  • >db.webs.find({age:{$lt:10}}) 查詢age小於10的數據
  • >db.webs.find({age:{$lte:10}}) 查詢age小於等於10的數據
  • >db.webs.find({age:{$ne:10}}) 查詢age不等於10的數據
  • >db.webs.find({age:{gt:10,gt:10,lt:20}}) 查詢age大於10小於20的數據

當value值是數字字符串

> db.webs.find({age:{$gt:'20'}})
{ "_id" : ObjectId("5da43db377f482015bd3759b"), "name" : "wangwu", "age" : "22" }
{ "_id" : ObjectId("5da43f5277f482015bd3759c"), "name" : "zhaoliu", "age" : "24" }
{ "_id" : ObjectId("5da445bc77f482015bd3759d"), "name" : "zhangsan", "age" : "30" }
{ "_id" : ObjectId("5da445e077f482015bd3759e"), "name" : "zhangsan", "age" : "60" }
> db.webs.find({age:{$ne:'20'}})
{ "_id" : ObjectId("5da43d8777f482015bd37599"), "name" : "zhangsan", "age" : "18" }
{ "_id" : ObjectId("5da43db377f482015bd3759b"), "name" : "wangwu", "age" : "22" }
{ "_id" : ObjectId("5da43f5277f482015bd3759c"), "name" : "zhaoliu", "age" : "24" }
{ "_id" : ObjectId("5da445bc77f482015bd3759d"), "name" : "zhangsan", "age" : "30" }
{ "_id" : ObjectId("5da445e077f482015bd3759e"), "name" : "zhangsan", "age" : "60" }
> db.webs,find({age:{"$lt":"20","$gt":"18"}})
2019-10-14T18:40:37.113+0800 E  QUERY    [js] ReferenceError: find is not defined :
@(shell):1:9
  • >db.webs.find({age:{$mod:[10,0]}}) 查詢age%10==0的數據
> db.webs.find({age:{$mod:[10,2]}})
{ "_id" : ObjectId("5da43f5277f482015bd3759c"), "name" : "zhaoliu", "age" : 22 }
> db.webs.find({age:{$mod:[10,0]}})
{ "_id" : ObjectId("5da43db377f482015bd3759b"), "name" : "wangwu", "age" : 20 }
{ "_id" : ObjectId("5da445e077f482015bd3759e"), "name" : "zhangsan", "age" : 30 }
  • >db.webs.find({age:{$in:[1,2,3]}}) 查詢age屬於[1,2,3]中任何一個的數據
> db.webs.find({age:{$in:[16,18,20]}})
{ "_id" : ObjectId("5da43d8777f482015bd37599"), "name" : "zhangsan", "age" : 16 }
{ "_id" : ObjectId("5da43d9b77f482015bd3759a"), "name" : "lisi", "age" : 18 }
{ "_id" : ObjectId("5da43db377f482015bd3759b"), "name" : "wangwu", "age" : 20 }
  • >db.webs.find({age:{$nin:[1,2,3]}}) 查詢age不屬於[1,2,3]中任何一個的數據
> db.webs.find({age:{$nin:[20]}})
{ "_id" : ObjectId("5da43d8777f482015bd37599"), "name" : "zhangsan", "age" : 16 }
{ "_id" : ObjectId("5da43d9b77f482015bd3759a"), "name" : "lisi", "age" : 18 }
{ "_id" : ObjectId("5da43f5277f482015bd3759c"), "name" : "zhaoliu", "age" : 22 }
{ "_id" : ObjectId("5da445bc77f482015bd3759d"), "name" : "zhangsan", "age" : 24 }
{ "_id" : ObjectId("5da445e077f482015bd3759e"), "name" : "zhangsan", "age" : 30 }
  • >db.webs.find({age:{$size:2}) 查詢age是數組且大小爲2的數據

  • >db.webs.find({age:{$exists:true}}) 查詢包含age字段的數據

> db.webs.find({age:{$exists:true}})
{ "_id" : ObjectId("5da43d8777f482015bd37599"), "name" : "zhangsan", "age" : 16 }
{ "_id" : ObjectId("5da43d9b77f482015bd3759a"), "name" : "lisi", "age" : 18 }
{ "_id" : ObjectId("5da43db377f482015bd3759b"), "name" : "wangwu", "age" : 20 }
{ "_id" : ObjectId("5da43f5277f482015bd3759c"), "name" : "zhaoliu", "age" : 22 }
{ "_id" : ObjectId("5da445bc77f482015bd3759d"), "name" : "zhangsan", "age" : 24 }
{ "_id" : ObjectId("5da445e077f482015bd3759e"), "name" : "zhangsan", "age" : 30 }
  • >db.webs.find({age:{$exists:false}}) 查詢不包含age字段的數據
> db.webs.find({tel:{$exists:false}})
{ "_id" : ObjectId("5da43d8777f482015bd37599"), "name" : "zhangsan", "age" : 16 }
{ "_id" : ObjectId("5da43d9b77f482015bd3759a"), "name" : "lisi", "age" : 18 }
{ "_id" : ObjectId("5da43db377f482015bd3759b"), "name" : "wangwu", "age" : 20 }
{ "_id" : ObjectId("5da43f5277f482015bd3759c"), "name" : "zhaoliu", "age" : 22 }
{ "_id" : ObjectId("5da445bc77f482015bd3759d"), "name" : "zhangsan", "age" : 24 }
{ "_id" : ObjectId("5da445e077f482015bd3759e"), "name" : "zhangsan", "age" : 30 }
  • >db.webs.find({$or:[{age:10},{name:‘zhangsan’}]}}) 查詢符合兩個條件中任意一個的數據
> db.webs.find({$or:[{age:16},{age:20}]})
{ "_id" : ObjectId("5da43d8777f482015bd37599"), "name" : "zhangsan", "age" : 16 }
{ "_id" : ObjectId("5da43db377f482015bd3759b"), "name" : "wangwu", "age" : 20 }

篩選:

  • >db.webs.find().limit(n) 篩選第n個數據以前的所有數據(包括n),n爲0或不寫都是沒有約束
> db.webs.find().limit(0)
{ "_id" : ObjectId("5da43d8777f482015bd37599"), "name" : "zhangsan", "age" : "18" }
{ "_id" : ObjectId("5da43d9b77f482015bd3759a"), "name" : "lisi", "age" : "20" }
{ "_id" : ObjectId("5da43db377f482015bd3759b"), "name" : "wangwu", "age" : "22" }
{ "_id" : ObjectId("5da43f5277f482015bd3759c"), "name" : "zhaoliu", "age" : "24" }
> db.webs.find().limit(2)
{ "_id" : ObjectId("5da43d8777f482015bd37599"), "name" : "zhangsan", "age" : "18" }
{ "_id" : ObjectId("5da43d9b77f482015bd3759a"), "name" : "lisi", "age" : "20" }
  • >db.webs.find().limit(10).sort({age:-1}) 排序優先級高,先執行倒序排序,在篩選前十個數據
> db.webs.find().limit(3).sort({age:-1})
{ "_id" : ObjectId("5da445e077f482015bd3759e"), "name" : "zhangsan", "age" : 30 }
{ "_id" : ObjectId("5da445bc77f482015bd3759d"), "name" : "zhangsan", "age" : 24 }
{ "_id" : ObjectId("5da43f5277f482015bd3759c"), "name" : "zhaoliu", "age" : 22 }
  • >db.webs.find().skip(n) 獲取跳過前n個數據之後的數據
> db.webs.find().skip(5)
{ "_id" : ObjectId("5da445e077f482015bd3759e"), "name" : "zhangsan", "age" : 30 }
{ "_id" : ObjectId("5da4573877f482015bd3759f"), "name" : "ssss", "sex" : "man", "obj" : { "s" : "wqehk", "g" : 10 } }
  • >db.webs.find().count() 返回結果集的條數
  • >db.webs.find().skip(5).limit(5).count(true) 在加入skip()和limit()這兩個操作時,要獲得實際返回的結果數,需要一個參數true,否則返回的是符合查詢條件的結果總數
> db.webs.find().count()
7
> db.webs.find().limit(3).count(true)
3
  • >db.webs.find({name:‘zhangsan’},{age:1,_id:0}) 查找到數據部分顯示
> db.webs.find({name:'zhangsan'},{age:1,_id:0})
{ "age" : 30 }
{ "age" : 30 }
{ "age" : 30 }

模糊查詢:

  • >db.webs.find({name:/zhang/}) 查詢字段name中包含zhang的數據
> db.webs.find({name:/san/})
{ "_id" : ObjectId("5da43d8777f482015bd37599"), "name" : "zhangsan", "age" : 16 }
{ "_id" : ObjectId("5da445bc77f482015bd3759d"), "name" : "zhangsan", "age" : 24 }
{ "_id" : ObjectId("5da445e077f482015bd3759e"), "name" : "zhangsan", "age" : 30 }

3.4 修改數據
  • db.web.update({“name”:“a1”}, {$set: {sex:”women”}},true,true) 修改name=a1的數據爲sex=1,第一個參數是查找條件,第二個參數是修改內容,主鍵不能修改,第三個參數表示匹配所有符合條件的數據,第四個參數表示修改所有匹配到的數據如圖
> db.webs.update({name:'lisi'},{$set:{age:18}},true,true)
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-lAUf84M1-1571106613745)(en-resource://database/692:1)]


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章