1. 程式人生 > >學習筆記☞ MongoDB(芒果資料庫) ☞【修改命令,修改器操作符,索引,聚合】

學習筆記☞ MongoDB(芒果資料庫) ☞【修改命令,修改器操作符,索引,聚合】

修改資料

mysql修改資料:
    update tablename set 修改後的欄位名和指 where ……

1、MongoDB修改:

    命令:
        db.collectionName.update(query,update,upsert,multi)
    功能:
        修改一個文件
    引數:
        query:    
            篩選要修改的文件,相當於mysql中where子句,用法同查詢
        update:
            將資料更新為什麼內容    相當於set操作
            需要使用修改器操作符
        upsert:
            布林值,預設為false,表示如果query的文件不存在,則無法修改
            設定為true,表示如果query的文件不存在,則根據query和update引數插入新的文件
        multi:
            bool值,預設為false,表示如果有多條符合篩選條件的文件,則只修改第一條
            若為true,表示修改所有符合條件的文件
    示例:
        # (前兩個引數)將阿紅年齡修改為24
            db.class0.update({name:'阿紅'},{$set:{age:24}})
        # (第三個引數示例) 如果篩選資料不存在則插入一個新的文件
            db.class0.update({name:'啊'},{$set:{age:18,sex:'w'}},true)
        # (第四個引數示例) 可以修改多條匹配到的文件
            db.class0.update({sex:'w'},{$set:{age:18}},false,true)

2、修改器操作符:

    1、$set

        功能:
            1、修改一個域的值
            2、增加一個域
        示例:
            # 增加一個sex屬性
            db.class0.update.({name:'阿紅'},{$set:{sex:'w'}})

    2、$unset

        功能:
            刪除一個域
        示例:
            # 刪除文件的sex和age域(後面數字習慣寫1或0)
            db.class0.update({name:'悟空'},{$unset:{sex:0,age:0}})

    3、$rename

        功能:
            修改域的名稱
        示例:
            # 修改sex域名稱為gender,必須有第四個引數,否則修改一文件的域名稱
            db.class0.update({},{$rename:{sex:'gender'}},false,true)

    4、$setOnInsert

        功能:
            如果update操作插入新的文件,則豐富插入內容
        示例:
            #無阿華的文件,則插入並補充setOnInsert內容,如果有阿華的文件則僅設定年齡為21
            db.class0.update({name:'阿華'},{$set:{age:21},$setOnInsert:{sex:'m',tel:'123456'}},true)

    5、$inc

        功能:
            加減修改器
            對某個與的值進行加減
            值必須為數值
        示例:
            # 所有年齡小於18的,年齡減2
            db.class0.update({age:{$lt:18}},{$inc:{age:-2}},false,true)
        注:
            $inc 可加減 整數 負數 小數 都可以

    6、$mul

        功能:
            乘法修改器
        示例:
            # 阿華年齡乘2
            db.class0.update({name:'阿華'},{$mul:{age:2}})
        注:
            $mul可乘 整數 負數 小數 都可以

    7、$min

        功能:
            設定最小值
            如果篩選的文件指定的域值小於min值則不修改,如果大於min值則改為min值
        示例:
             db.class0.update({},{$min:{age:19}},false,true)

    8、$max

        功能:
            設定最大值
            如果篩選的文件指定的域值大於max值則不修改,如果小於max值則改為max值
        示例:
            db.class0.update({},{$max:{age:20}},false,true)

    9、陣列修改器

        1、$push

            功能:
                向陣列中新增一項
            示例:
                # 向Abby中新增一項socre
                 db.class1.update({name:'Abby'},{$push:{score:30}})

        2、$pushAll

            功能:
                向陣列中新增多項
            示例:
                db.class1.update({name:'Jame'},{$pushAll:{score:[10,20]}})

        3、$each

            功能:
                逐個操作
            示例:
                db.class1.update({name:'Lily'},{$push:{score:{$each:[10,5]}}})

        4、$position

            功能:
                選擇資料位置進行操作
                必須和each合用
            示例:
                #將兩個加分項插入到成績列表的[1]位
                db.class1.update({name:'Lucy'},{$push:{scort:{$each:[10,10],$position:1}}})

        5、$sort

            功能:
                對陣列進行排序
                必須和each合用
            示例:
                db.class1.update({name:'Lucy'},{$push:{score:{$each:[],$sort:1}}})

        6、$pull

            功能:
                從陣列中刪除一個元素
            示例:
                #從Lucy成績中去掉5的值,如果含有多個則都去掉
                db.class1.update({name:'Lucy'},{$pull:{score:5}})

        7、$pullAll

            功能:
                從陣列中刪除多個元素
            示例:
                # 從James中去掉值為10和20的元素
                db.class1.update({name:'Jame'},{$pullAll:{scort:[10,20]}})

        8、$pop

            功能:
                彈出陣列中的一項,陣列的第一個或者最後一個
            示例:
                
                db.class1.update({name:'Abby'},{$pop:{score:1}})
            注:
                -1代表彈出陣列中第一項
                1表示彈出最後一項

        9、$addToSet

            功能:
                向陣列中插入一個元素,但是該元素不能喝其他元素重複
            示例:
                # 插入已存在元素,未插入
                > db.class1.update({name:'Lily'},{$addToSet:{score:58}})
                WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
                # 插入不存在元素,插入成功
                > db.class1.update({name:'Lily'},{$addToSet:{score:66}})
                WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })            

3、資料型別補充

    1、時間型別

        MongoDB中儲存時間的格式:ISODate

    2、生成當前時間

        方法1 (自動生成當前時間):
            db.class2.insert({title:'python入門',date:new Date()})    
        方法2 (自動生成當前時間):
            db.class2.insert({title:'python精通',date:ISODate()}))
        方法3 (將生成的時間變為字串儲存):
            db.class2.insert({title:'pythonAI',date:Date()})    

    3、指定時間轉換

        命令:
            ISODate()
        功能:
            生成mongo時間型別
        引數:
            如果不加引數則生成當前時間
            引數格式:
                "2018-11-11 11:11:11"
                "20180101 11:11:11"
                "20180102"
        示例:
            # 生成指定時間
            db.class2.insert({title:'python 爬蟲',date:ISODate("20180101")})
        時間戳獲取        
            db.class2.insert({title:'python web',date:ISODate().valueOf()})

4、null

    用途:
        1、如果某個域存在卻沒有值可以設定為null
            示例:db.class2.insert({title:'python祕籍',price:null})
        2、表示某個域不存在可以通過null進行匹配
            # 匹配不存在data域或data域為null的文件
            db.class2.find({date:null},{_id:0})

6、Object型別(值是一個文件)    

    注:當使用外層文件引用內部文件的時候可以使用 . 的方法,在使用的時候需要加上引號
        示例:
            db.class2.find({'publication.publisher':'人民教育出版社'})
        # 修改Object型別內資料
        db.class2.update({title:'python資料'},{$set:{'publication.price':58.8}})

7、陣列的下表引用:

    1、使用一個數組時,可以使用 .序列下標 的方式使用陣列具體的某一項。同樣需要用引號
        示例:
            #將Lily的成績的第一項改為60
            db.class1.update({name:'Lily'},{$set:{'score.0':60}})
            

8、文件查詢結果的有序性

    示例:
        可以通過[]取查詢結果序列的某一項
        db.class1.find({},{_id:0})[0]

9、索引

    1、定義

        指的是建立指定鍵值及所在文件儲存位置的對照清單,使用索引可以方便我們進行快速查詢,減少遍歷次數,提高查詢效率。

    2、MongoDB中如何建立索引

        enserIndex()
        功能:
            建立索引
        引數:
            索引類別,索引選項
        示例:
            #用name建立索引
            db.class0.ensureIndex({name:1})
        注:
            1 表示建立正向索引,-1 表示逆向索引
            _id 域會自動建立索引

    3、檢視一個集合中的索引

        getIndexes()

        示例:
         db.class0.getIndexes()

    4、刪除索引

        dropIndex()
        功能:
            刪除索引
        引數:
            刪除索引的名稱
        示例:
            刪除name索引
            #通過索引名稱刪除索引
            db.class0.dropIndex('name_1')
            或
            #通過索引鍵值對刪除索引
            db.class0.dropIndex({name:1})

    5、刪除所有索引

        dropIndexes()
        功能:
            刪除所有索引,除_id外
        示例:
            db.class0.dropIndexes()

10、索引型別

    1、複合索引

        根據多個域建立一個索引
        ensereIndex()
        示例:
            # 根據name和age建立一個索引
            db.class0.ensureIndex({name:1,age:-1})

    2、陣列索引

        如果對某個陣列域建立索引,那麼表示對陣列中的每個值均建立了索引,通過對陣列中的單個值查詢,也是索引查詢
        示例
            db.class1.enserIndex({'score':1})

    3、子文件索引

        如果對一個域建立索引,值是一個文件則子文件同時也會形成索引
        如果對子文件某一個域進行索引建立,則只有通過子文件中的該域查詢為索引查詢
        示例:
            db.class2.ensureIndex({'publication':1})

    4、覆蓋索引

        查詢時只獲取索引項的內容,而不去獲取元資料中的其他內容,這樣就不去連線原來的資料直接返回即可
        示例
            # name為索引項,顯示也只要name域
            db.class0.find({name:'Lily'},{_id:0,name:1})

    5、唯一索引

        建立索引時希望索引域的值均不相同,也可以據此限制一個域的值
        1、建立唯一索引
            示例:
                db.class0.ensureIndex({name:1},{'unique':true})
        注:當對某個域建立了唯一索引後,既不允許再插入該域有相同的值的文件

    6、稀疏索引(間隙索引)

        只針對有指定域的文件建立索引表,沒有該域的文件,不會插入到索引表中
        示例:
            #以date為指定域建立一個稀疏索引
            db.class2.ensureIndex({'date':1},{sparse:true})

11、索引約束(缺點)

    1、影響資料的插入、刪除、修改操作,當資料發生改變時,索引表必須同步更新
    2、索引也需要佔用一定的空間資源
    綜上:
        1、當資料庫大量的操作是插入,修改,刪除操作,而非查詢操作時,不適合建立索引
        2、資料量比較小時,考慮到空間成本也不適合建立索引
        3、即使適合建立索引時,也不是索引越多越好。

12、聚合

    多資料文件進行整理統計

    1、db.collectionName.aggegate()

        功能:
            聚合函式,配合聚合條件進行資料整理統計
        引數:
            聚合條件

    2、聚合操作符

        1、$group

            功能:
                分組
                和分組操作符配合使用來確定按什麼分組
            分組操作符(和group配合使用):
                1、$sum
                    功能:
                        求和
                    示例:
                        # 按gender分組統計每組的個數
                        db.class0.aggregate({$group:{_id:'$gender',num:{$sum:1}}})
                                    聚合      分組    按gender分組  統計結果名
                        結果
                            { "_id" : "", "num" : 1 }
                            { "_id" : "m", "num" : 2 }
                            { "_id" : null, "num" : 4 }
                            { "_id" : "w", "num" : 4 }

                        # 按gender分組統計每組年齡的和
                        db.class0.aggregate({$group:{_id:'$sex',num:{$sum:'$age'}}})
                        結果:
                            { "_id" : "", "num" : 20 }
                            { "_id" : "m", "num" : 40 }
                            { "_id" : null, "num" : 80 }
                            { "_id" : "w", "num" : 80 }
                2、$avg
                    功能:
                        求平均數
                    示例:
                        # 按gender分組求每組平均年齡
                            db.class0.aggregate({$group:{_id:'$sex',num:{$avg:'$age'}}})
                        結果
                            { "_id" : "", "num" : 20 }
                            { "_id" : "m", "num" : 20 }
                            { "_id" : null, "num" : 20 }
                            { "_id" : "w", "num" : 20 }
                3、$min
                    功能:
                        求最小值
                    示例:
                        # 按gender分組求每組name的最小值
                        db.class0.aggregate({$group:{_id:'$sex',num:{$min:'$name'}}})
                4、$max
                    功能:
                        求最大值
                    示例:
                        db.class0.aggregate({$group:{_id:'$sex',num:{$max:'$name'}}})
                5、$first
                    功能:
                        返回每組第一個文件指定域值
                    示例:
                        db.class0.aggregate({$group:{_id:'$sex',num:{$first:'$name'}}})
                6、$last
                    功能:
                        返回每組最後一個文件指定域值
                    示例:
                        db.class0.aggregate({$group:{_id:'$sex',num:{$last:'$name'}}})

        2、$project

            功能:
                用於修飾文件的顯示結構
                示例:
                    db.class0.aggregate({$project:{_id:0,name:1,age:1}})
                    結果:
                        { "name" : "Lily", "age" : 20 }
                        { "name" : "Lucy", "age" : 20 }

                    db.class0.aggregate({$project:{_id:0,Name:'$name',Age:'$age'}} )
                    結果:
                        { "Name" : "Lily", "Age" : 20 }
                        { "Name" : "Lucy", "Age" : 20 }

        3、$match    過濾資料

            操作符的值同find的query
            示例:
                db.class0.aggregate({$match:{gender:'m'}} )

        4、$skip     跳過前幾條文件

            示例:
                # 跳過前兩條
                db.class0.aggregate({$skip:2} )

        5、$limit    顯示幾條文件

            示例:
                #顯示前兩條
                db.class0.aggregate({$limit:2} )

        6、$sort 排序

            示例:
                # 按姓名進行排序
                db.class0.aggregate({$sort:{name:1}} )

聚合管道:

    將前一個聚合操作的結果給下一個聚合操作繼續執行
    格式:
        db.collectionName.aggregate([聚合1,聚合2,……])
    示例:
        db.class0.aggregate([{$group:{_id:'$sex',num:{$sum:1}}},{$match:{$nor:[{_id:'m'},{_id:'w'}]}}])