python學習筆記——mongodb數據庫

1 概述

1.1 文件管理階段

優勢:能夠長期保存 能存儲大量數據java

缺點:沒有結構化的組織 查找不方便 數據容易冗餘python

1.2 數據庫管理階段

有文件存儲的優勢,同時解決了文件存儲的問題mysql

缺點 : 操做難度較高linux

數據 --> 數據庫 --> 數據庫管理系統 --> 數據庫系統c++

2 數據庫分類

2.1 關係型數據庫

採用關係磨性來組織數據結構的數據庫正則表達式

常見數據庫形式有:Oracle DB2  SQLServer  Mysql  sqliteredis

優勢:sql

(1)容易理解,使用方便,sql語句自己比較成熟,而關係型數據庫大都採用sql作數據操做mongodb

(2)易於維護,完整性好,數據一致性高shell

(3)通用化程度高,技術成熟,可使用外鏈等操做

缺點:

(1)沒法很好知足高併發需求,每次數據操做都須要解析sql語句,致使讀寫能力降低(通常該類型數據庫都是用C / C++語言編寫的,輸入時採用sql語句,須要編譯)

(3)針對海量數據的爆發處理能力不足,每次操做都要上鎖

(4)擴展性不足

 

2.2 非關係型數據庫 (Nosql not only sql)

優勢:

(1)能夠知足高併發需求,讀寫能力強

(2)支持分佈式部署

(3)弱化了數據結構,下降了數據的一致性

缺點:

(1)發展比較晚,技術尚不成熟,好比缺乏join等複雜性操做,通用性差,沒有sql這樣的語句

(2)結構靈活,靈活則會致使混亂,寫法複雜

 

非關係性數據庫(Nosql)適用那些狀況

(1)數據磨性結構簡單

(2)對數據的一致性要求低

(3)對數據的併發處理要求高

(4)對數據的擴展性有要求

 

非關係型數據庫Nosql分類

(1)鍵值類數據庫:

    redis  oracle  DBD  tokyo

    如:name:張三

(2)列存儲:

    HBase

(3)文檔型數據庫:

    MongDB

    { name:張三, sex:男}

(4)圖形數據庫

3 MongoDB數據庫

3.1 數據庫特色

(1)非關係型 文檔型

(2)C++ 編寫,支持分佈式

(3)數據格式爲bson類型,bson格式是jion的升級版,他豐富了json的數據類型

(4)功能比較前面

(5)支持衆多編程語言接口 python ruby C#  C++ PHP

3.2 MongoDB的安裝

自動安裝

在Linux系統中的安裝步驟

(1)sudo apt -get update

(2)sudo apt -get install mongodb

 

默認安裝目錄:/var/lib/mongodb

配置文件:

    /etc/mongodb.conf

   /usr/bin

 

手動安裝

(1)www.mongodb.com 下載安裝包

(2)在目錄下解壓  /usr/local/opt

(3)解壓後將文件夾中bin目錄添加到環境變量中

        export PATH = $PATH:/usr...

3.3 mongo的基本操做

在linux終端上輸入mongo能夠啓動mongo shell

 

tarena@tedu:~$ mongo
MongoDB shell version: 2.6.10
connecting to: test

 

該模式下支持簡單的語法

quit() 退出 mongo shell

mongod

--dbpath:指定數據目錄,每一個mongod進程都須要獨立的數據目錄,若是要是有3哥mongod實例,則必須有3個獨立的數據目錄;當mongod啓動時,會在數據庫目錄中建立mongod.lock文件,這個文件用於防止其餘的mongod純淨使用該數據目錄

 

--port:指定服務器監聽的端口號,默認端口號爲27017,要運行多個mongo進程,則要給每一個指定不一樣的端口號。

--logpath:指定日誌的輸出路徑,若是對文件夾有讀寫權限,系統會在文件不存在時建立它,它會將已有文件覆蓋掉;

--logappend:同logpath,但該選項可不會將原有文件覆蓋,而是保留原來的日誌

--config:指定配置文件,加載命令行未指定的各類選項

3.4 mongo的基本概念

爲了對比,現將關係型數據庫mysql與mongo進行對比

(1)MySQL與mongo基本含義對比

MySQL           mongo          含義

database         database       數據庫

table              collection       表/集合

column          field             字段/域

row               document     記錄/文檔(每一條信息稱之爲文檔)

index            index            索引

(2)數據形式對比

MySQL數據(表)結構形式

---------------------------
id |   name    | age
---------------------------
1 |    Lily       | 10
---------------------------
2 |    Lucy     | 11
---------------------------

mongo數據結構(字典)

 

{
'_id':ObjectId("xxxxxxxxxxxxxxxxxxx"),
'name': 'Lily',
'age': 10
},
{
'_id':ObjectId("xxxxxxxxxxxxxxxxxxx"),
'name': 'Lucy',
'age': 11
}

 

3.5 建立數據庫

建立數據庫:use dbname(dbname爲數據庫名)

注:

(1)use爲選擇使用的數據庫,若是數據庫不存在,則插入數據時會自動建立該數據庫

實例:

 

tarena@tedu:~$ mongo
MongoDB shell version: 2.6.10
connecting to: test
> use dbname
switched to db dbname
>
# use 並非直接將數據庫建立起來,主要仍是選擇這個數據,只有真正建立這個表時,纔是真正建立這個數據庫
> show dbs
admin (empty)
local 0.078GB
mongo_test 0.078GB
>
# 此時並無顯示dbname數據庫,因裏面並無數據

(2)db(全局變量)表示當前正在使用的數據庫,若是沒有use選用目標數據庫,則默認使用一個叫test的數據庫

tarena@tedu:~$ mongo
MongoDB shell version: 2.6.10
connecting to: test
> db
test
> use dbname
switched to db dbname
> db
dbname

 

數據庫的命名規則和特色

(1)數據庫支持格式爲utf-8

(2)數據庫區分大小寫,原則上都是小寫;sql語句則不區分大小寫

(3)命名也能夠是utf-8格式,但不能是空字符串

(4)數據庫名不能含有:空格、點、/ \ '\0'

(5)不能超過64字節

(6)數據庫避免與諸如admin、local、config等數據庫關鍵字衝突

 

注:admin(存儲用戶權限)、local(存儲不想被分享複製的數據)、config(當分佈式操做時纔會出現,表示分片處理信息)

3.6 數據的備份與恢復

備份:

mongodump   -h   dbhost     -d   dbname   -o    dbdir
                               主機              數據庫           文件夾

tarena@tedu:~$ mongodump -h 127.0.0.1 -d stu -o dbstudent
connected to: 127.0.0.1
2018-05-08T22:28:06.022+0800 DATABASE: stu     to     dbstudent/stu
...

查找是否已經備份成功

tarena@tedu:~$ ls
AID1709.csv  dbstudent                   PycharmProjects  視頻  下載
anaconda3    examples.desktop            公共的           圖片  音樂
core         java_error_in_PYCHARM_.log  模板             文檔  桌面

tarena@tedu:~$ ls dbstudent/
stu

 

恢復數據

mongorestore  -h  dbhost    -d      dbname                                 <path>
                              主機               將數據回覆到那個數據庫        要恢復數據庫文件夾

tarena@tedu:~$ mongorestore -h 127.0.0.1:27017 -d student student/stu
connected to: 127.0.0.1:27017
...

3.7 數據庫刪除

db.dropDatebase()

功能:刪除當前數據庫

3.8 數據庫檢測

tarena@tedu:~$ mongostat
connected to: 127.0.0.1
insert  query update delete getmore command flushes mapped  vsize    res faults  locked db idx miss %     qr|qw   ar|aw  netIn netOut  conn       time 
    *0     *0     *0     *0       0     1|0       0   640m  1.47g    35m      1  test:0.0%          0       0|0     0|0    62b     4k     1   22:40:13 
    *0     *0     *0     *0       0     1|0       0   640m  1.47g    35m      0  test:0.0%          0       0|0     0|0    62b     4k     1   22:40:14 

具體截圖

備註:insert (每秒的插入次數) query(每秒的查詢次數) update(更新次數) delete(刪除次數 )

3.9 檢測數據庫的讀寫時長

mongotop  監測數據庫的讀寫時長 

tarena@tedu:~$ mongotop
connected to: 127.0.0.1

                            ns       total        read       write        2018-05-08T14:48:20
        grid.system.namespaces         0ms         0ms         0ms
           grid.system.indexes         0ms         0ms         0ms
                 grid.fs.files         0ms         0ms         0ms
                grid.fs.chunks         0ms         0ms         0ms
       grade.system.namespaces         0ms         0ms         0ms
          grade.system.indexes         0ms         0ms         0ms
                   grade.class         0ms         0ms         0ms

截圖顯示

3.10 查看數據庫

 查看方式:show dbs

tarena@tedu:~$ mongo
MongoDB shell version: 2.6.10
connecting to: test
> show dbs
admin       (empty)
dbname      0.078GB
local       0.078GB
mongo_test  0.078GB
> use stu
switched to db stu
> db.createCollection('class0')
{ "ok" : 1 }
> db.createCollection('class0')
{ "ok" : 0, "errmsg" : "collection already exists" }

 

4 集合

 db.createCollection(collection_name) 

功能:建立一個集合

參數:集合的名稱

注:至關於 sql 語句中的表

4.1 集合的命名規則

(1)集合名不能以system 開頭,它是系統集合保留的前綴

(2)集合名稱不要和關鍵字重名,不要帶有$

(3)集合名能含有 ‘\0'

(4)集合也是utf-8字符串

 

4.2 集合的建立

 db.collection_name.insert() 

collection_name:集合名

當插入數據時,若是集合不存在則會自動建立;此也意味着,若將集合名稱寫錯時也會建立新的集合並插入數據

4.3 查看數據庫中的集合

tarena@tedu:~$ mongo
MongoDB shell version: 2.6.10
connecting to: test
> show collections
class3
system.indexes
> show tables
class3
system.indexes
> 

show collections 和 show tables 能夠達到相同效果

4.4 集合的建立(一)

db.createCollection(collection_name)

功能:建立一個集合

參數:集合的名稱

命名規則:

(1)集合也是utf-8 字符串

(2)不能含有'\0',由於最終是用c++來解析的,當存在'\0'時,c++就會默認爲這是結束的

(3)不能以system.開頭,他是系統集合的保留前綴

(4)集合名稱不要和關鍵字重名 ,不要帶有$,mongdb中好多關鍵字是有$引入的,也即,集合名稱不要額操做符重名

4.5 集合的建立(二)

db.collection_name.insert()

當插入數據時,集合不存在時則會自動建立

若是將集合名稱寫錯時,也會建立新的集合並插入數據

4.6 刪除一個集合

刪除指定的集合:db.collecton_name.drop() 

> show collections
abc
class0
class1
system.indexes
> db.abc.drop()
true
> show collections
class0
class1
system.indexes

4.7 集合的重命名

db.collection_name.renameCollection(new_name)

參數:新的集合名稱

> show collections
class0
class1
system.indexes
> db.class1.renameCollection('cls')
{ "ok" : 1 }
> show collections
class0
cls
system.indexes
>

5 文檔

在形式上相似於python中的字典,每一個文檔內部由 0個 或 多個 鍵值對構成,但文檔不一樣於字典的是,文檔是有序的。

bson:{'name':'licy','age':18}

 

鍵的命名規則:

(1)鍵值均爲uft-8類型字符串,因此做爲鍵時,加不加都可

> db.class0.insert({'name':'李四'  ,age:19,})
WriteResult({ "nInserted" : 1 })
> db.class0.find()
{ "_id" : ObjectId("5abf2fe426803c9f334a1019"), "name" : "李四", "age" : 19 }
>

(2)不能有‘\0',通常不會以點.和 $ 開頭,也不使用下劃線_開頭

(3)鍵不能重複

 

文檔中的值:

指的是mongo數據庫支持的數據類型

mongo支持的數據類型:

字符串            utf-8字符串均爲合法字符串

整型               32位 和64位

布爾類型        true false 或者1 0來表示也能夠

浮點型           小數

Arrays            用來存儲數組胡列表

Timestamp     時間戳,存儲時間節點

Date              時間類型,年月日時分秒

Symbol          字符串類型 一般用來存儲特殊字符

Null                null類型 表示空

object            文檔類型(一般用於內部文件)

Binary data    二進制數據

code              代碼 js

regex             正則表達式

ObjectId        系統自動生成的ID對象

 

在一個集合中文檔的域不必定相同,也就是說鍵值對不必定徹底相同

在一個文檔中儘可能選擇意義相同的文檔放入統一集合中

5.1 insert() 方法

db.collection.insert()

例如

> db.class0.insert({'name':'李四'  ,age:19,})
WriteResult({ "nInserted" : 1 })
> db.class0.find()
{ "_id" : ObjectId("5abf2fe426803c9f334a1019"), "name" : "李四", "age" : 19 }
>
ObjectId("5abf2fe426803c9f334a1019")

_id:是系統自動提供的主鍵,

5abf2fe4             26803c    9f33        4a1019     24位16進制

文檔建立時間      機器ID     進程ID     計數器

 

插入多條文檔

insert([{},{},{}])

db.class0.insert([{'name':'王五',age:18,sex:'女'},{name:'張三',age:19,sex:'女'}])

insert() 插入數據時,也能夠採用_id 來自定義插入id值,但id值不能重複。

5.2 save() 方法

db.collection.save()

實例

db.class0.save({_id:2,name:'婁拉',age:22,sex:''})

注:

(1)當插入鍵值對中沒有_id 域時,同insert

(2)當插入鍵值對有_id值,則會將擬插入的_id值與已插入的_id值進行匹配,若是匹配到已經插入的值,則會對相應文檔進行修改,若是沒有匹配到則其功能至關於insert(),將會插入到數據庫中

(3)save() 沒法插入多條數據

5.3 find() 查找

db.collection.find(query, field)

功能:查找文檔

參數:

    query 查找條件 {name:'張三'}

    field 顯示的域  {_id:0}

返回值:返回查找到的文檔(返回第一條,先進先出,查找的第一條,也即先輸入的第一條)

 

field的值的表示方式:{field:0|1}

    0:表示不顯示該域

    1:表示顯示該域

注:

(1)若將某個域設置爲1,則表示其餘域均爲0

(2)若將某個域設置爲0,則表示其餘域均爲1

(3)不容許同時設置1和 0

(4)_id 永遠默認爲1,也可將其設置爲0

5.4 findOne()查找

db.collection.findOne(query, field)

功能:只查找第一條符合查找條件的數據

參數:同find同樣

返回值:返回第一條匹配到的文檔

5.5 獲取集合對象

db.getCollection('class0') ==  db.class0

6 條件查找

6.1 比較操做符

=  >   <   >=  <=  !=

$eq 等於

計算 age=20 的記錄

db.class0.find({age:{$eq:20}},{_id:0})

 

$lt     小於
$lte   小於等於
$gt    大於
$gte  大於等於
$ne   不等於

例如:

db.class0.find({age:{$gte:19,$lte:21}},{_id:0})

 

$in 包含

db.class0.find({age:{$in:[17,18,19]}},{_id:0})

 

$nin 不包含

db.class0.find({age:{$nin:[18,21]}},{_id:0})

 

6.2 邏輯操做符

and   or   not 

$and  邏輯與

db.class0.find({$and:[{name:'張三'},{age:19}]},{_id:0})

注:query 中逗號分割的多個條件默認就是and關係

 

$or  邏輯或

db.class0.find({$or:[{age:{$lt:19}},{age:{$gt:21}}]},{_id:0})

 

$not  邏輯非

db.class0.find({age:{$not:{$gt:20}}},{_id:0})

 

$nor  既不是也不是

db.class0.find({$nor:[{age:{$gt:20}},{sex:'男'}]},{_id:0})

 

6.3 混合查找

age  > 21  or  (namg = 張三  and  sex != 女)

db.class0.find({$or:[{age:{$gt:21}},{name:'張三',sex:{$not:{$eq:'女'}}}]},{_id:0})

db.class0.find({$or:[{age:{$gt:21}},{name:'張三',sex:{$nin:['女']}}]},{_id:0})
相關文章
相關標籤/搜索