天天看點

MogoDB學習筆記day01

第一天

MongoDB (芒果資料庫)

資料存儲階段

檔案管理階段  (.txt  .doc .xls)

優點:  使用簡單,展現直覺,

    可以長期儲存資料

    可存儲資料量比較大

缺點:  查找不友善

    容易造成資料備援

    資料格式不規範

資料庫管理階段

優點:将資料結構化存儲,降低備援

      提高了增删改查效率

      友善擴充,友善程式調用

缺點:資料庫往往需要指令或語句操作,相對複雜

幾個概念

資料 : 能夠輸入到計算機中并被識别處理的資訊的集合

資料結構 : 組成一個資料集合的資料之間的關系

資料庫 : 按照一定的資料結構,存儲資料的倉庫。資料庫是在資料庫管理系統和控制下,

在一定媒體的資料集合

資料庫管理系統 : 資料庫管理軟體 ,用于建立維護操作資料庫

資料庫系統:由資料庫和資料庫管理系統等開發工具組成的集合

關系型資料庫 : 采用關系模型(二維表)來組織資料結構的資料庫 

Orcale  DB2  SQLServer Mysql SQLie

優點:容易了解,邏輯類似常見的表格

    使用友善,都使用SQL語句,sql語句非常成熟

    資料一緻性高,備援低,資料完整性好,便于操作

    技術成熟,功能強大,支援很多複雜操作

缺點: *每次操作都要進行sql語句解析,消耗較大

       *不能很好地滿足并發需求,特别是海量資料爆發,

    關系型資料庫讀寫能力會顯得不足

       *關系型資料庫往往每一步都要進行加鎖的操作,也造成了資料庫的負擔

       *資料一緻性高,有時也會使資料的存儲不靈活

非關系型資料庫(NoSql ------> not only sql)

優點 : 高并發 ,讀寫能力強

    弱化資料結構一緻性,使用更加靈活

    有良好的可擴充性

缺點 : 通用性差,沒有sql語句那樣通用的語句

    操作零活,導緻容易出錯和混亂

    沒有外鍵關聯等複雜的操作

Nosql 的使用情況

1.對資料存儲靈活性要求高,一緻性要求低

2.資料處理海量并發,要求瞬間效率速度比較高

3.資料比較容易建立Nosql模型

4.網站臨時緩沖存儲,爬蟲應用

Nosql分類

1.鍵值型資料庫  Redis

2.文檔型資料庫  MongoDB

3.列存儲資料庫  HBase

4.圖形資料庫    

MongoDB資料庫

标簽:  非關系型資料庫          文檔型資料庫     最像關系型的非關系型資料庫

特點:

    1.是由C++編寫的資料庫管理系統

    2.支援豐富的資料操作,增删改查索引聚合

    3.支援豐富的資料類型

    4.使用友善,可以很好地擴充,相對比較成熟

    5.支援衆多的程式設計語言接口  (python PHP c++ c#)

要求:

    1.關系型資料庫和非關系型資料庫各自有什麼特點

     1. 關系型資料庫:

           優點:

         * 容易了解,邏輯類似于常見的表格

         * 使用友善,都使用SQL語句,sql語句非常成熟

         * 資料一緻性高,,備援低,資料完整性好,便于操作

             * 技術成熟,功能強大,支援很多複雜操作

       缺點:

             * 每次操作都要進行sql語句解析,消耗比較大

         * 不能哼好的滿足并發需求,特别是海量資料爆發

           關系型資料庫讀寫能力會顯得不足

           關系型資料庫往往每一步都要進行加鎖的操作,也造成了資料的負擔

         * 資料一緻性高,有時也會是資料的存儲不靈活

     2. 非關系型資料庫:

        優點:

           * 高并發,讀寫能力強

           * 弱化資料結構一緻性,使用更靈活

           * 有良好的可擴充性

        缺點:通用性差,沒有sql語句那樣通用的語句

    操作零活,導緻容易出錯和混亂

    沒有外鍵關聯等複雜的操作

               * 通用性插,沒有sql語句那樣通用的語句

           * 操作靈活,導緻容易出錯和混亂

           * 沒有外間關聯等複雜的操作

    2.MongoDB是一個什麼樣的資料庫

       文檔型資料  非關系型資料庫  最像關系型資料庫的非關系型資料庫

       特點:

        1.是由c++編寫的資料庫管理系統

        2.支援豐富的資料操作,增删改查索引聚合

        3.支援豐富的資料類型

        4.使用友善,可以很好地擴充,相對比較成熟

        5。支援衆多的程式設計語言借口 (python PHP c++ c#)

MongoDB的安裝

自動安裝

sudo apt-get install mongodb

預設安裝位置 : /var/lib/mongodb

配置檔案位置 : /etc/mongo.conf

指令集: /usr/bin    /usr/local/bin

手動安裝

1.下載下傳安裝包  

www.mongodb.com

2.解壓安裝包

/usr/local    /opt

3.将解壓後的MongoDB檔案夾中的bin目錄添加到環境變量

PATH=$PATH:/opt/mongo..../bin

export PATH

将以上兩句寫入啟動腳本  /etc/rc.local

4.重新開機

MongoDB 指令

設定資料庫存儲位置

mongod --dbpath  目錄

e.g. 将存儲路徑設定為dbs

    mongod --dbpath bds

設定資料庫監聽端口

mongod --port 8080

* 預設監聽端口 27017

mongo

進入資料庫互動界面

mongo shell : 用來操作mongodb資料庫的界面,在這裡可以使用mongo

語句操作資料庫的内容

退出 mongo shell : quit()    exit    ctrl-c

組織結構: 鍵值對 --> 文檔 --> 集合-->資料庫

--------------------------------

   id    |  name  |    age

--------------------------------

    1    |  Lily  |    17       

--------------------------------

    2    |  Mike   |    18

--------------------------------

(

 'id':1,

 'name':'Lily',

 'age':17

)

(

 'id':2,

 'name':'Mike',

 'age': '18'

)

mysql 和 mongodb 概念對比

mysql         mongodo     含義

database      database    資料庫

table         collection  表/集合

cloumn        field       字段/域

row           document    記錄/文檔

index         index       索引

三個表

1.使用者資訊      1

1.朋友圈内容    多     多

2.其他使用者點贊,評論   多

{id:xxx,'name':'zhan',age:12,pyq:[{data:xxx,content:xxx,image:[1,2,3],zan:[id1,id2],p1:[{data:xx,con:xxx},{},{}]},{}]}

建立資料庫

use databaseName

e.g.  建立一個名字為stu的資料庫

use stu

* use實際為選擇使用哪個資料庫,當資料庫不存在時會自動建立

* use後并不會立即建立出資料庫,而是需要等到插入資料時資料庫才會建立

檢視系統中的資料庫:

show dbs

系統資料庫說明

admin : 存儲使用者資訊

local : 存儲本地資料

config : 存儲分片資訊

資料庫的命名規則

1.使用utf-8字元 (mongo預設之後utf-8)

2.不能含有 空格 . / \  '\0'  字元

3.長度不能超過64位元組

4.不能和系統資料庫重名

db: mongodb的全局量,代表目前正在使用的資料庫

*如果不選擇任何資料庫,db代表test,直接插入資料就會建立test

資料庫

資料庫的備份和恢複

e.g. 将本機test資料庫備份到bak目錄下

備份  mongodump -h host -d dbname -o bak

恢複 mongorestore -h dbhost:port -d dbname path

e.g. 将test資料庫恢複到本機的res資料庫中(res不存在自動建立)

tarena@tedu:~/mongodb$ mongorestore -h 127.0.0.1:27017 -d res bak/test

資料庫的監測

mongostat   監測資料庫運作資料

    insert query update delete:   每秒增查改删的次數

    flushes    每秒和磁盤互動的次數

    vsize  虛拟記憶體

    res    實體記憶體

    time   時間

mongotop   監測資料庫讀寫時長

ns     資料表

total  總時間

read   讀時間

write  寫時間

db.dropDatebase()

删除db所代表的資料庫

課外:

辨別符命名方法

python 中習慣用下劃線連結 socket_server

大駝峰方法: SocketServer

小駝峰方法: sOCKETsERVER

匈牙利方法: iKonw

建立集合 

方法1:

db.createCollection(collection_name)

例:建立class1集合

    db.createCollection('class1')

方法2:

當想一個集合中插入資料時如果集合不存在則自動建立

db.collection_name.insert(...)

檢視資料庫中的集合

show collections

show tables

集合命名規則

1.合法的UTF-8字元

2.不能有'\0'

3.不能以system.開頭,因為這是系統保留集合字首

4.不能和關鍵字重名

删除集合

db.collection.drop()

e.g. 删除class2集合

    db.class2.drop()

集合的重命名

db.collection.renameCollection('new_name')

e.g. 将class 集合重命名為 class0

db.class.renameCollection('class0')

文檔

MongoDB中的資料的組織形式   -->文檔

MongoDB 文檔 :是以鍵值對的形成的一組資料。類似python中

        字典描述資料的方式

鍵 : 即文檔的域,表達了一個鍵值對的含義

鍵的命名規則:

    1.UTF-8格式字元串

    2.不能使用'\0'

    3.一個文檔中鍵不能重複

值 : 即文檔存儲的資料。

* 文檔中鍵值對是有序的

* 文檔中鍵值對嚴格區分大小寫

mongo 文檔的資料格式 bson

bson   ---> json  ---> Javascript

mysql 支援的資料類型  :字元,數字,日期時間,枚舉

Mongo中資料類型

類型                  值

整型                  整數 1  2   3

布爾類型          true  false

浮點型                小數

Array                 數組

Date              時間日期

Timestamp             時間戳

String              字元串

Symbol              特殊字元串

Binary data           二進制字元串

Null                  null

Object                内部文檔(對象)

code                  js代碼

regex                 正則子串

ObjectId          自動生成ID标記

 "_id" : ObjectId("5ba07692bebd2ef8b41dab68")

 _id : 當mongodb插入文檔時如果不指定_id域則自動生成id域。

 值如果不自己制定即會自動生成一個ObjectId值

 5ba07692bebd2ef8b41dab68

 24 位 使用ObjectId經過算法處理保證其唯一性

 8 位 文檔建立事件  6位  機器id   4 位程序id  6位計數器

集合中的文檔

1.集合中的文檔不一定有相同的域

    * 個數不同

    * 域不相同

    * 資料類型可能不相同

2.集合中的文檔各自比較獨立,互相并不影響

集合建立原則

 1.集合中的文檔要描述同一類事物

 2.資料庫中同一類資料盡量集中文檔存放在相同的集合

 3.集合中的文檔嵌套層數不要太多

插入文檔

db.collection.insert()

功能: 插入一個文檔

參數: 要插入的文檔

插入單個文檔

e.g.

db.class0.insert({'name':'Lucy','age':18,'sex':'w'})

*插入操作中鍵可以不加引号

*檢視插入結果 db.class0.find()

*_id值可以自己插入 ,但是不能重複

插入多條文檔

 插入多條文檔時,參數用中括号,裡面放入多個文檔

e.g.

 db.class0.insert([{'name':'Alex',age:19,sex:'m'},{name:'Andy',age:18,sex:'w'}])

其他插入方法

 db.class0.insertOne()

   e.g.

   db.class0.insertOne({'name':'black',age:24,'sex':'m'})

 db.class0.insertOne()

   db.class0.insertOne({name:'god',age:11,sex:'w'},{name:'haha',age:19,sex:'w'})

save插入文檔

db.collection.save()

如果正常插入與insert用法相同

e.g.

 db.class0.save({name:'Allen',age:'18',sex:'m'})

 db.class0.save([{name:'Sunny',age:17,sex:'w'},{name:'Alice',age:16,sex:'w'}])

如果插入資料時 有_id 域 且_id域資料存在時則會修改原文檔,

如果該值不存在則正常插入

db.class0.save({_id:2,name:'Maey',age:20,sex:'w'})

擷取集合對象方法

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

作用:

1. 對‘要求’問題進行總結,描述

2. 練習資料庫的建立删除,集合建立删除

3. 練習資料庫的插入操作

4. 複習mysql基本增删改查操作 

========================day 02================================

複習:

1.非關系型資料庫和關系型資料庫的差別

   * 不是以關系模型建構的,結構比較自由

   * Nosql不保證資料的一緻性

   * Nosql彌補了關系型資料庫的一些不足,比如高并發,海量資料處理

   * Nosql讀寫能力強

   * Nosql技術還在不斷的快速發展,功能沒有關系型資料庫成熟強大

2.Mongodb  文檔型非關系型資料庫

    建立資料庫: use databasename

    删除資料庫: db.dropDatabase()

    建立集合: db.create.Collection('class')

           db.class1.insert()

    删除集合: db.collection.drop()

    集合重命名:   db.collection.renameCollection()

    檢視資料   show dbs

    檢視集合   show collections

           show tables

    資料備份   mongodump  -h host -d dbname -o bak

    資料恢複   mongorestore  mongorestore -h dbhost:port -d dbname path

    插入文檔   inert()   save()

查找操作:

mysql : select * from table where ...

mongodb : db.collection.find(query,field)

查找所有内容

db.collection.find()  ----> select * from table

find(query,field)

功能: 查找文檔

參數: query 查找條件,相當于where字句

       field 查找的域

傳回值: 傳回查找到的所有文檔

query : 以鍵值對的方式傳遞參數,如果是空{}表示查找所有内容

    例:查找所有性别為w的文檔

    db.class0.find({'sex':'w'})

field : 以鍵值對的方式給出要查找(不查找)的域,以域名為鍵,以0,1

    為值分别表示不查找和查找

* 如果某一個或多個域設定為0 表示這些域不查找,其他域均查找

* 如果某一個或多個域設定為1 表示這些域查找,其他域均不查找

* _id  除非設定為0, 否則均會查找

* 除_id域其他與不能夠有的設定為1 有的設定為0

e.g. 查找結果隻有name域

db.class0.find({sex:'w'},{_id:0,name:1})

findOne(query,field)

功能: 查找第一條符合條件的文檔

參數: 同find

傳回值: 傳回查找到的文檔

query更多的篩選用法

操作符: 使用$符合注明的一個特殊字元串,表達一定的含義,比如$lt 表示小于

比較操作符使用:

$eq 等于  =

    e.g.  查找年齡等于18

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

    ===》db.class0.find({age:18},{_id:0})

$lt 小于 <

    e.g. 查找年齡小于20的

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

    e.g. 插找姓名小于Tom的

    db.class0.find({name:{$lt:'Tom'}},{_id:0})

* 在mongodb中字元串可以比較大小

$lte 小于等于 <=

    e.g. 查找年齡小于等于18的

    > db.class0.find({age:{$lte:18}},{_id:0})

%gt  大于  >

    e.g. 查找年齡大于16,小于19的

    db.class0.find({age:{$gt:16,$lt:19}},{_id:0})

* 在mongodb中所有的{},[]中都可以寫多個條件。但根據參數的不同表達的意思不一樣

$gte  大于等于 >=

    e.g. 查找年齡大于等于19 的

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

$ne   不等于  !=

    e.g. 查找年齡不等于19 的

    > db.class0.find({age:{$ne:19}},{_id:0})

    e.g. 查找年齡不等于‘m’的

    db.class0.find({sex:{$ne:'m'}},{_id:0})

* 如果某個域不存在,使用ne查找也會找到該域不存在的文檔

$in  包含

    e.g. 查找年齡在[17,19,19]中的資料

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

$nin 不包含

    e.g. 查找年齡不在[17,18,19]中的資料

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

邏輯操作符

$and 

1.在query 如果寫多個條件預設即為and關系

    e.g.

    db.class0.find({age:{$lt:18},sex:'m'},{_id:0})

    ==>

    db.class0.find({$and:[{age:{$lt:18},sex:'m'}]},{_id:0})

$or 邏輯或

    e.g. 年齡大于18 或年齡小于16 

    db.class0.find({$or:[{age:{$lte:16}},{age:{$gt:18}}]},{_id:0})

    e.g. 年齡小于18 或者是女的 

    db.class0.find({$or:[{age:{$lte:18}},{sex:'w'}]},{_id:0})

$not 邏輯非

    e.g.性别不是男的

    db.class0.find({sex:{$not:{$eq:'w'}}},{_id:0})

    e.g.年齡不小于18的

    db.class0.find({age:{$not:{$lt:18}}},{_id:0})

$nor not (a or b)  ===   (not a) and (not b)

    e.g. 性别不是男的,年齡不小于18

    db.class0.find({$nor:[{sex:'m'},{age:{$lt:18}}]},{_id:0})

邏輯條件混合

(年齡大于17 并且為男生)   或者  姓名叫Abby

db.class0.find({$or:[{age:{$gt:17},sex:'m'},{name:'Abby'}]},{_id:0})

(年齡不大于18 或者為女性) 并且姓名大于Lucy

db.class0.find({$and:[{$or:[{age:{$not:{$lt:18}}},{sex:'w'}]},{name:{$gt:'Lucy'}}]},{_id:0})

Array  數組

[1,2,3,4]

* 數組是有序的資料集合

* mongo中數組也可以有多重資料元素集合

查找數組中包含某一條件的元素

e.g.  隻要數組中包含元素小于60的元素即可查詢過濾

db.class1.find({score:{$lt:60}},{_id:0})

$all: 

e.g.   查找同時包含49 67的文檔

db.class1.find({score:{$all:[49,67]}},{_id:0})

$size

通過數組元素個數查找

e.g.  通過元素個數為3的文檔

db.class1.find({score:{$size:3}},{_id:0})

$slice

顯示數組指定項

e.g. 顯示數組前兩項

 db.class1.find({},{_id:0,score:{$slice:2}})

e.g.  跳過第一個顯示後面兩個

 db.class1.find({},{_id:0,score:{$slice:[1,2]}})

$exists

通過某個域是否存在篩選

e.g.:查找不存在sex域的文檔

db.class1.find({sex:{$exists:false}},{_id:0})

$mod

餘數查找

e.g.: 查詢年齡為奇數的資料

db.class1.find({age:{$mod:[2,1]}},{_id:1})

e.g.   查詢年齡為偶數的資料

db.class1.find({age:{$mod:[2,0]}},{_id:0})

$type

找出指定資料類型的文檔

例: 名字為字元串類型   string:2

      db.class1.find({name:{$type:2}},{_id:0})

      score為數組(但内部資料屬于double類型)  double:1

      db.class1.find({score:{$type:1}},{_id:0})

      age 為int型 但是被自動轉化為double類型   double:1

      db.class1.find({age:{$type:1}},{_id:0})

查找結果的操作函數

db.collection.distinct(field)

功能: 檢視某個域的值範圍

傳回值: 一個清單(無重複元素)

pretty()

功能:格式化顯示查詢結果

例: db.class0.find().pretty()

limit(n)

功能:顯示前n條結果

e.g.  顯示查詢結果前3條數   

   db.class0.find({},{id:0}).limit(3)

skip(n)

功能: 跳過前n條顯示後面的查詢結果

e.g. 顯示查詢結果(跳過前3條)

    db.class0.find({},{_id:0}).skip(3)

    db.class0.find({},{_id:0}).limit(4).skip(2)

    ===》

    db.class0.find({},{_id:0}).limit(4).skip(2)

count()

功能:統計查詢結果數量

e.g. 年齡大于18 的文檔有幾條

db.class0.find({age:{$gt:18}},{_id:0}).count()

* 在統計數量時要給出一定query條件呢

e.g. 統計性别為w的文檔個數

db.class0.find({sex:'w'},{id:0}).count()

sort({field:1/-1})

功能:對查找結果進行排序

參數: 以鍵值對表示按照哪個field排序

       1 表示升序 ,-1表示降序

e.g.  按照年齡升序排序

   db.class0.find({},{_id:0}).sort({age:1})

e.g.  按照年齡降序排序

   db.class0.find({},{_id:0}).sort({age:-1})

e.g. 複合排序  按照年齡升序排序,年齡相同按照姓名降序排序

   db.class0.find({},{_id:0}).sort({age:1,name:-1})

函數連續的調用

 e.g.  傳回集合内年齡最小的三位

    db.class0.find({},{_id:0}).sort({age:1}).limit(3)

删除文檔

mysql :delete  from where

        alter table t1  drop  字段

mongodb : db.collection.remove(query,justOne)

remove(query,justOne)

功能 : 删除文檔

參數 :query  用法同find

       justOne  布爾值 預設為false 表示删除所有符合條件的文檔

                設定為 true 表示隻删除一條

e.g. 删除所有不存在sex域的文檔

db.class1.remove({sex:{existe:false}})

e.g. 删除性别為女中的第一條文檔

db.class1.remove({sex:'w'},true)

删除class1中所有文檔

db.class1.remove({})

練習:

1.建立資料   名稱 grade

2.建立集合   名稱 class

3.集合中插入若幹文檔 文檔格式

{name:'zhangsan',age:10,sex:'m',hobby:['a','b']}

年齡範圍 6-15

愛好選擇 : draw sing dance basketball football

pingpang  computer  每個同學選擇2-5項

4. 查找練習

查找班級所有學生資訊

    db.class.find()

查找班級中年齡為8歲的學生資訊

    db.class.find({age:8},{_id:0})

查找班級中年齡大于10歲的學生資訊

    db.class.find({age:{$gt:10}},{_id:0})

檢視班級中年齡在8-11歲之間的學生資訊

    db.class.find({age:{$gt:8},age:{$lt:11}},{_id:0})

檢視班級中年齡10歲且為男生的學生資訊

    db.class.find({age:10,sex:'m'},{_id:0})

檢視班級中小于7歲或者大于14歲的學生

    db.class.find({$or:[{age:{$lt:7}},{age:{$gt:8}}]},{_id:0})

檢視班級中年齡為8歲或者11歲的學生

    db.class.find({age:{$in:[8,11]}},{_id:0})

找到有兩項興趣愛好的學生

    db.class.find({hobby:{$size:2}},{_id:0})

找到興趣中 有draw的學生

    db.class.find({hobby:'draw'})

找到即喜歡畫畫又喜歡跳舞的學生

    db.class.find({hobby:{$all:['draw','dance']}})

    db.class.find({hobby:'draw',hobby:'dance'})

統計興趣有4項的學生的人數

    db.class.find({hobby:{size:4}},{_id:0})

找出本班年齡第二大的學生

    db.class.find({},{_id:0}).sort({age:-1}).skip(1).limit(1)

檢視本班學生興趣愛好涵蓋哪些方面

    db.class.distinct('hobby')

找到年齡最大的三個同學

    db.class.find().sort({age:-1}).limit(3)

删除所有年齡大于16歲或者小于7歲的學生除非他的愛好有三項以上

    db.class.remove({$or:[{age:{$gt:16}},{age:{$lt:7}}],hobby:{$lt:{$size:3}}})

修改文檔

mysql: update table set ...where ...

mongodb:

    db.collection.update(query,update,upsert,multi)

功能:  修改文檔

參數:  query   篩選條件   用法同find

    update  要求改成什麼内容  通常配合修改操作符(修改器)使用

    upsert  布爾值,預設是false 如果query沒有篩選到文檔則不作任何操作

        如果設定為true 則如果query沒有篩選到文檔則query和update内容插入新的文檔

    multi   布爾值  預設為false  表示如果有多條符合條件文檔則隻修改第一條;

        如果設定為true   則表示修改所有符合條件的文檔

将 Tom的年齡修改為18

    db.class0.update({name:'Tom'},{$set:{age:18}})

将 Jame 插入到文檔中

    db.class0.update({name:'Jame'},{$set:{age:15}},true)

将所有年齡小于17的修改為18

    db.class0.update({age:{$lt:17}},{$set:{age:18}},false,true)

作業: 

    1.練習查找操作 

    2.練習删除和修改操作

    3.将三國改為mongo版,按照mysql課上練習進行增删改查操作

*******************************day 03********************************

複習

查找操作  find(query,field)

      findOne(query,field)

查找操作符   比較運算符 $eq   $lt  $gt  $ne  $lte  $gte  $in  %nin   

         邏輯運算符 $and  $or  $not  $nor

         數組       $all   $size      $slice

             其他       $exists    $mod   $type

查找函數: pretty()   limit()  skip()   sort()  count()   

           db.class.dictinct('域名')   #  檢視某個域的取值範圍

删除操作: remove(query,justOne)

修改操作:update(query,updata,upsert,multi)

=====================================================================

補充: 通過find查找結果,可以使用序列号擷取某一項

    e.g.  擷取查找結果中的第三項

      db.class0.find({},{_id:0})[2]

 修改操作符(修改器)

 $set  

    修改一個域的值

    e.g.  修改Lily的年齡為17

        db.class0.update({name:'Lily'},{$set:{age:17}})

    增加一個域

    e.g. 為jame增加sex域

    db.class0.update({name:'jame'},{$set:{sex:'m'}})

$unset

    删除一個域

    e.g.  删除god 的 sex域

    db.class0.update({name:'god'},{$unset:{sex:''}})

$rename

    修改域的名稱

    e.g.   将sex域名改為gender

    db.class0.update({},{$rename:{sex:'gender'}},false,true)

$setOnInsert

    如果使用update插入了文檔,則将該修改器内容作為插入文檔的一部分

    相當于補充插入

    e.g.   插入 lisimeng 年齡18 性别w 電話 123456

    db.class0.update({name:'lisimeng'},{$set:{age:18},$setOnInsert:{gender:'w',tel:'123456'}},true)

$inc

    加法修改器

    e.g. 所有人年齡加1

    db.class0.update({},{$inc:{age:1}},false,true)

* 參數可以使正數負數,整數小數

$mul

    乘法修改器

    e.g.   所有人年齡乘以2

    db.class0.update({},{$mul:{age:0.5}},false,true)

* 參數可以使正數負數,整數小數

$min

    如果篩選文檔的指定域值小于min值則不修改,大于min

    值則修改為min值

     e.g.    Alex age 如果大于19則修改為19

     db.class0.update({name:'Alex'},{$min:{age:19}})    

$max

    如果篩選文檔的指定域大于max值則不修改,小于max值

    則修改為max值

    e.g.    Alex  age 如果小于25則修改為25

     db.class0.update({name:'Alex'},{$max:{age:25}})

$push

    向數組中添加一項

    e.g. 給小紅 score 數組添加一項91

    db.class1.update({name:'小紅'},{$push:{score:91}})

$pushAll

    向數組中添加多項

    e.g. 給小喬score 數組中添加 94,10

   > db.class1.update({name:'小喬'},{$pushAll:{score:[94,10]}})

$pull 

    從數組中删除一項

    e.g. 删除小紅score 數組中78 

    db.class1.update({name:'小紅'},{$pull:{score:78}})

$pullAll

    從數組中删除删除多項

    e.g.

    db.class1.update({name:'小喬'},{$pullAll:{score:[94,10]}})

$each

    對多個值逐個程序操作

    例 分别插入 99 10

    db.class1.update({name:'小喬'},{$push:{score:{$each:[99,10]}}})

$position

    指定位置

    例 将67插入到數組1号位置

    db.class1.update({name:'小明'},{$push:{score:{$each:[67],$position:1}}})

$sort

    數組排序

    e.g. 排序score數組 按降序排序

    db.class1.update({},{$push:{score:{$each:[],$sort:-1}}})

$pop

    彈出一項   1表示彈出最後一項 

              -1 表示彈出第一項

    e.g. 彈出小喬的最後一項

    db.class1.update({name:'小喬'},{$pop:{score:1}})

    e.g. 彈出小明的第一項

    db.class1.update({name:"小明"},{$pop:{score:-1}})

$addToSet

    向數組中添加一項,但是不能添加重複内容

    e.g. 如果數組中沒有81,則添加81

    b.class1.update({name:'小剛'},{$addToSet:{score:81}})

時間資料類型

mongo中存儲時間大多為 ISODate

存儲目前時間方法

    1. new Date()  自動生成目前時間

     e.g.

     db.class2.insert({book:'python入門',data:new Date()})

    2. ISODate()   自動生成目前時間

     e.g.

     db.class2.insert({book:'python精通','date':ISODate()})

    3.Date()    将系統時間轉化為字元串

     e.g.

     db.class2.insert({book:'python瘋狂',date:Date()})

指定時間

    ISODate()

    功能: 生成mongo标準時間類型資料

    參數: 如果不傳參預設為目前時間

           傳參表示指定時間

            “2018-01-01 12:12:12”

        “20180101 12:12:12 ”

        "20180101"

    e.g.

      db.class2.insert({book:'python奔潰',date:ISODate('2018-07-01 11:15:56')})

時間戳

    valueOf()

    擷取某個時間的時間戳

    db.class2.insert({name:'python涅槃',date:ISODate().valueOf()})

Null 類型

1. 如果某個域存在沒有值 可以指派為null

   e.g.

   db.class2.insert((book:'python死去活來',pirce:null))

2. 可以查找某個域不存在的情況

   e.g. 如果date域不存在也能find到

   db.class2.find({date:null})

Object(内部文檔)

文檔内部某個域的值還是一個文檔資料則這個文檔就是内部文檔資料類型

通過使用外部文檔域名,引用内部文檔域名的方式使用内部文檔

e.g. 

   db.class3.find({'book.title':'狂人日記'})

e.g.

   db.class3.update({'book.title':'圍城'},{$set:{price:48.8}})

通過數組下标直接操作某一項

e.g.  查找數組中第一項(注意加引号)

    db.class1.find({'score.0':{$gt:90}},{_id:0})

練習

使用之前的grade資料庫

1.将小紅年齡改為12歲,興趣愛好變為跳舞畫畫

 db.class.update({name:'cui'},{$set:{age:12,hobby:['dance','draw']}})

2.追加小明愛好唱歌

 db.class.update({name:'li'},{$push:{hobby:'sing'}})

3.追加小王興趣愛好,吹牛,打籃球

db.class.update({name:'xiao'},{$pushAll:{hobby:['吹牛','打籃球']}})

4.小李興趣多了跑步和唱歌,但是要確定和以前不重複

db.class.update({name:'zhao'},{$addToSet:{hobby:'sing',hobby:'run'}})

5.将班級所有男同學的年齡加1

db.class.update({sex:'m'},{$inc:{age:1}},false,true)

6.删除小明的sex屬性

db.class.update({name:'li'},{$unset:{sex:''}})

7.修改小劉的年齡為15,如果不存在該同學則添加,同時要添加興趣愛好和性别男

db.class.update({name:'yang'},{$set:{age:15},$setOnInsert:{sex:'m',hobby:['sing','dance']}},true)

8.删除小李興趣中第一項

db.class.update({name:'xiao'},{$pop:{hobby:-1}})

9.删除小紅愛好中的畫畫和跳舞

db.class.update({name:'cui'},{$pullAll:{hobby:['draw','dance']}})

索引

是指建立指定鍵值及所在文檔存儲位置的對照清單,使用索引可以友善我們進行快速查找

減少周遊次數提高查找效率

ensureIndex()

功能: 建立索引

參數: 索引域和索引選項

e.g.根據 name 域 建立索引

    db.class0.ensureIndex({name:1})

* 1 表示正序索引,   -1 表示逆序索引

檢視集合中索引

db.collection.getIndexes()

自定義索引名稱

db.collection.ensureIndex({},{name:'myIndex'})

db.class.ensureIndex({age:1},{name:'ageIndex'})

删除索引

db.colletion.dropIndex('index')

功能: 删除索引

參數: 要删除的索引名稱或者鍵值對

e.g.

db.class.dropIndex({name:1})

db.class.dropIndex('ageIndex')

db.collection.dropIndexes()

功能: 删除所有索引

*_id 是系統自動建立的主鍵索引,不能删除

索引類型

    符合索引

    根據多個域建立多個索引

 e.g.

  db.class.ensureIndex({name:1,age:-1},{name:'name_age'})

數組索引 ,子文檔索引

 如果對某個域的值為數組或者子文檔的域建立索引,那麼通過數組或者子文檔

 中某一項進行查找也是索引查找

 e.g.  如果對score 建立了索引那麼該查找就是索引查找

 db.class1.ensureIndex({'score':1})

 db.class1.find({'score.1':88})

唯一索引

建立索引的域要求值不能重複,

    e.g.

    db.class1.ensureIndex({name:1},{name:'nameIndex',unique:true})

* 當對某個域建立了唯一索引就不能插入重複的值

稀疏索引(間隙索引)

隻針對有索引域的文檔建立索引,沒有該域的文檔不會插入到索引表

db.class1.ensureIndex({age:1},{sparse:true})

索引限制

  * 索引表需要占用一定的資料磁盤空間

  * 當對資料進行增 删 改 查等寫入操作時索引也需要更新,降低了資料修改的

  效率

綜上 :資料量較小時不适合建立索引,當資料庫進行頻繁的修改操作而不是查找操作

時也不适合建立索引。針對一個集合并不是建立索引越多越好。

聚合操作

    對文檔的篩選結果進行整理統計

    db.collection.aggregate()

    功能:完成聚合操作

    參數: 聚合條件   ---》 聚合操作符

聚合操作符

$group  分組聚合  需要配合具體的分組統計選項

    $sum : 求和

    e.q.    

    db.class0.aggregate({$group:{_id:'$gender',num:{$sum:1}}})

    { "_id" : "m", "num" : 6 }

    { "_id" : null, "num" : 1 }

    { "_id" : "w", "num" : 5 }

    分别求男女生年齡的和

    db.class0.aggregate({$group:{_id:'$gender',num:{$sum:'$age'}}})

    { "_id" : "m", "num" : 105 }

    { "_id" : null, "num" : 19 }

    { "_id" : "w", "num" : 91 }

$avg: 求平均數

    分别求男女生年齡的平均數

    > db.class0.aggregate({$group:{_id:'$gender',avg:{$avg:'$age'}}})

    { "_id" : "m", "avg" : 21 }

    { "_id" : null, "avg" : 19 }

    { "_id" : "w", "avg" : 18.2 }

$max: 最大值 

     分别求男女生年齡的最大值

     db.class0.aggregate({$group:{_id:'$gender',max:{$max:'$age'}}})

     { "_id" : "m", "max" : "18" }

     { "_id" : null, "max" : 19 }

     { "_id" : "w", "max" : 19 }

$min 分比求男女生年齡的最小值

     db.class0.aggregate({$group:{_id:'$gender',min:{$min:'$age'}}})

     { "_id" : "m", "min" : 18 }

     { "_id" : null, "min" : 19 }

     { "_id" : "w", "min" : 17 }

$project 

    修改文檔的顯示效果

    > db.class0.aggregate({$project:{_id:0,name:1,age:1}})

{ "name" : "Alice", "age" : 18 }

{ "name" : "Jame", "age" : 18 }

{ "name" : "lisimeng", "age" : 18 }

    > db.class0.aggregate({$project:{_id:0,Name:'$name',Age:'$age'}})

{ "Name" : "Lily", "Age" : 18 }

{ "Name" : "Lucy", "Age" : 19 }

{ "Name" : "Tom", "Age" : 19 }

$match

 資料篩選

   $match值得用法同query一緻

   e.g. 過濾年齡大于18歲的資料文檔

   db.class0.aggregate({$match:{age:{$gt:18}}})

$limit

 篩選前幾條文檔

 篩選前三條資料

  db.class0.aggregate({$limit:3})

$skip

 跳過幾條文檔顯示

  e.g. 跳過前三條顯示後面的資料文檔

  db.class0.aggregate({$skip:3})

$sort

 将資料排序

 将年齡按升序排序

 db.class0.aggregate({$sort:{age:1}})

聚合管道:

聚合管道指的是将上一個集合的操作結果給下一個聚合繼續操作

db.collection.aggregation({聚合},{},{}....)

db.class0.aggregate([{$match:{gender:'m'}},{$project:{_id:0}},{$sort:{age:1}}])

{ "name" : "Jame", "age" : 18, "gender" : "m" }

{ "name" : "lisimeng", "age" : 18, "gender" : "m", "tel" : "123465" }

db.class0.aggregate([{$group:{_id:'$name',num:{$sum:1}}},{$match:{num:{$gt:1}}}])

{ "_id" : "Jame", "num" : 2 }

作業: 練習資料庫的修改和索引操作

       練習資料庫的聚合操作

       操作符複習 

*******************day 04**********************

複習:

1.修改操作

update(query,update,upsert,multi)

修改器   $set   $unset    $rename   $setOnInsert

       $inc  $mul  $max   $min

       $push  $pushAll  $pull  $pullAll

       $each  $position  $sort

       $pop  $addtoSet

時間類型: new Date()

           Date()

       ISODate()

       valueOf()

Null類型:  null

        * 表示某個域的值沒有意義

        * 比對某個域不存在

Object類型: 通過外部域名,内部文檔域名

索引:提高查詢效率

ensureIndex()   建立索引

dropIndex()     删除索引

dropIndexes()   删除多個索引

類型:複合索引    唯一索引    稀疏索引

聚合操作:

aggregate([])

聚合操作符:

    $group  $sum  $avg  $min  $max

    $project

    $match

    $limit

    $skip

    $sort

===========================================

固定集合

mongodb中可以建立大小固定的集合,稱之為固定集合

特點:能夠淘汰早期資料

      插入和順序查找速度快

      可以控制集合的空間大小

使用: 臨時緩沖

       日志處理

建立固定集合

    db.createCollection(collection,{capped:true,size:100,max:1000})

    capped: true  表示建立固定集合

    size  : 表示指定集合的大小  位元組

    max  : 表示集合存放文檔上限

* size max 兩者取最低

e.g.建立名為log的固定集合,size為1000 ,最多存3條文檔

  db.createCollection('log',{capped:true,size:1000,max:3})

檔案存儲:

1.存儲檔案路徑 (通常檔案較大)

  e.g.

  db.log.insert({filename:'三隻廣告牌.mp4',size:982.8,path:'/home/tarena//三支廣告.mp4'})

優點:  節省資料庫空間

        操作簡單快捷

缺點:  當資料庫或者檔案位置放生變化時需要修改資料庫内容

2.存儲檔案本身

  将檔案以二進制的形式存儲到資料庫中

  優點: 資料庫在檔案在,不會受到遷移等影響

  缺點: 占用資料庫空間大

     存取效率低

GridFS   存儲大檔案

大檔案: 在Mongodb中認為 >16M的檔案為大檔案

GridFS 方法

    在mongodb中以兩個集合配合的方法存儲檔案

    fs.files  :  存儲檔案相關資訊(檔案名,檔案類型)

    fs.chunks  : 分塊存儲檔案實際内容

存儲檔案格式

mongofile -d dbname put file

dbname: 要将檔案存入的資料庫,如果不存在則自動建立

file  : 要儲存的檔案

     e.g.

    mongofiles -d grid put 三塊廣告牌.mp4

 fs.files檔案結構

{ "_id" : ObjectId("5ba452de69d72e14da68505b"), 

"chunkSize" : 261120, 

"uploadDate" : ISODate("2018-09-21T02:10:11.370Z"),

"length" : 982823909,

"md5" : "0ece20f2b5936daf5e77ababb285ef57",

"filename" : "三塊廣告牌.mp4" }

提取檔案:

 mongofiles -d dbname get file 

 e.g.

 mongfiles -d grid get 三塊廣告牌

優缺點:

優點 : 操作友善,提供較好的存儲指令,使用資料庫存儲檔案友善移植

缺點 : 讀寫效率低 

遊标 cursor

通過擷取操作資料庫的傳回結果,得到傳回結果對象。

通過遊标可以進一步擷取操作結果資料

将傳回結果賦給一個js 變量,作為查找結果遊标

var cursor = db.class0.find()

檢視是否有下一個結果

cursor.hasNext()

擷取下一個結果

cursor.next()

python  --> pymongo 子產品

安裝:  sudo pip3 install pymongo

操作步驟

1.建立mongodb的資料庫的連接配接對象

conn = pymongo.MongoClinet('localhost',27017)

2.生成資料庫對象(__setitem__ __getitem__  把屬性取值變為類似于字典取值的屬性)

db = conn.stu

db = conn['stu']

3.生成集合對象

myset = db.class0

myset = db['class0']

4. 集合操作(增删改查索引聚合)

5.關閉資料庫連接配接

conn.close()

 插入操作   

  insert()

  insert_many()

  insert_one()

  save()

查找操作

find()

功能:查找資料庫内容

參數:同mongo shell find()

傳回值: 傳回一個結果遊标

find_one()

功能: 查詢第一條符合條件的文檔

參數:同find()

傳回值:傳回一個字典

* 在pymongo中所有操作符的用法同mongo shell相同

隻是操作時加引号,以字元串的方式寫入python代碼

cursor 對象的屬性

next()

limit()

skip()

count()

sort()

pymongo  -> sort([('age',1),('name',-1)])

mongo shell  ->  sort({age:1,name:-1})

* 使用for 或者next 使用遊标位置不再指向開頭位置

的時候,調用limit  skip  sort 就會報錯

修改操作

update(query,update,upsert=False,multi=False)

update_many()

update_one()

删除操作:

remove(query,multi = True)

multi預設是True表示删除所有query過濾文檔

設定為False表示隻删除第一個

python 中 True ==> ture

          False ==> false

      None ==> null

索引操作

ensure_index()

list_indexes()

drop_index()

drop_indexes()

聚合操作

aggregate([])

參數: 和mongo shell 一樣

傳回值: 傳回和find()函數相同的遊标對象

聚合練習

grade資料庫 class集合

1.為所有人添加score域值為{'chinese':88,'math':77,'english':78}

2.按照性别分組,統計每組人數

3.統計每名男生的國文成績

4.将女生按照英語成績降序排列

pymongo 實作 gridfs存儲

import gridfs

GridFS()

功能:生成grid資料庫對象

存儲小檔案

import bson