知識點 mongodb

mongodb知識點:增:use config    db.config.insert({'a':1})查:show dbs    show collections/show tables刪:use pro //使用數據庫時不加分號    db.ta.drop()//表的刪除    db.dropDatabase()//刪除當前庫增:單條增長user0={      "name":"egon",      "age":10,      'hobbies':['music','read','dancing'],      'addr':{          'country':'China',          'city':'BJ'      }  }  db.test.insert(user0)多條批量增長:db.user.insertMany([ , , , , ,])的形式user1={    "_id":1,    "name":"alex",    "age":10,    'hobbies':['music','read','dancing'],    'addr':{        'country':'China',        'city':'weifang'    }}user2={    "_id":2,    "name":"wupeiqi",    "age":20,    'hobbies':['music','read','run'],    'addr':{        'country':'China',        'city':'hebei'    }}db.user.insertMany([user1,user2])刪:#一、刪除符合條件的第一個文檔db.user.deleteOne({ 'age': 8 })#第一個包含有 'age': 8的文檔#二、刪除符合條件的所有db.user.deleteMany( {'addr.country': 'China'} ) #只要有內嵌文檔,且內容含有country': 'China'的全都刪除db.user.deleteMany({"_id":{"$gte":3}})#刪除id大於等於3的全部#三、刪除所有db.user.deleteMany({}) #等因而清空該集合(表)查:查的形式有不少,如比較運算、邏輯運算、成員運算、取指定字段、對數組的查詢、使用正則、獲取數量,還有排序、分頁等等。下面咱們針對十種查的形式進行詳細說明注:在MongoDB中,用到方法都得用 $ 符號開頭1、比較運算:=,!= ('$ne') ,> ('$gt') ,< ('$lt') ,>= ('$gte') ,<= ('$lte')#一、select * from db1.user where id = 3db.user.find({"_id":3})#二、select * from db1.user where id != 3db.user.find({"_id":{"$ne":3}})#三、select * from db1.user where id > 3db.user.find({"_id":{"$gt":3}})2、邏輯運算:MongoDB中字典內用逗號分隔多個條件是and關係,或者直接用$and,$o,r$not(與或非)1 select * from db1.user where id >=3 and id <=4;db.user.find({"_id":{"$gte":3,"$lte":4}})#2 select * from db1.user where id >=3 and id <=4 and age >=40;db.user.find({    "_id":{"$gte":3,"$lte":4},    "age":{"$gte":40}})db.user.find({"$and":[{"_id":{"$gte":3,"$lte":4}},{"age":{"$gte":40}}]})#3 select * from db1.user where id >=0 and id <=1 or id >=4 or name = "yuanhao";db.user.find({"$or":[{"_id":{"$lte":1,"$gte":0}},{"_id":{"$gte":4}},{"name":"yuanhao"}]})#4 select * from db1.user where id % 2 = 1;db.user.find({"_id":{"$mod":[2,1]}})db.user.find({    "_id":{"$not":{"$mod":[2,1]}}})3、成員運算:成員運算無非in和not in,MongoDB中形式爲$in , $nin#一、select * from db1.user where age in (20,30,31);db.user.find({"age":{"$in":[20,30,31]}})#二、select * from db1.user where name not in ('alex','yuanhao');db.user.find({"name":{"$nin":['Stefan','Damon']}})4、正則:正則定義在/ /內# MongoDB: /正則表達/i#一、select * from db1.user where name regexp '^j.*?(g|n)$';db.user.find({'name':/^j.*?(g|n)$/i})#匹配規則:j開頭、g或n結尾,不區分大小寫5、查看指定字段:0表示不顯示1表示顯示#一、select name,age from db1.user where id=3;db.user.find({'_id':3},{'_id':0,'name':1,'age':1})#find的第二個參數是爲了顯示查出哪些字段#二、select name,age from db1.user where name regexp "^jin.*?(g|n)$";db.user.find({    "name":/^jin.*?(g|n)$/i},{    "_id":0,    "name":1,    "age":1})6、對數組的查詢:#查hobbies中有dancing的人db.user.find({    "hobbies":"dancing"})#查看既有dancing愛好又有tea愛好的人db.user.find({    "hobbies":{"$all":["dancing","tea"]}})#查看第2個愛好爲dancing的人db.user.find({    "hobbies.2":"dancing"})#查看全部人的第2個到第3個愛好db.user.find({},{    "_id":0,    "name":0,    "age":0,    "addr":0,    "hobbies":{"$slice":[1,2]},})#查看全部人最後兩個愛好,第一個{}表示查詢條件爲全部,第二個是顯示條件db.user.find({},{    "_id":0,    "name":0,    "age":0,    "addr":0,    "hobbies":{"$slice":-2},})#查詢子文檔有"country":"China"的人db.user.find({    "addr.country":"China"})7、對查詢結果進行排序:sort()  1表明升序、-1表明降序db.user.find().sort({"name":1,})db.user.find().sort({"age":-1,'_id':1})8、分頁:limit表示取多少個document,skip表明跳過幾個document#這樣就作到了分頁的效果db.user.find().limit(2).skip(0)#前兩個db.user.find().limit(2).skip(2)#第三個和第四個db.user.find().limit(2).skip(4)#第五個和第六個9、獲取數量:count()#查詢年齡大於30的人數#方式一:db.user.count({'age':{"$gt":30}})#方式二:db.user.find({'age':{"$gt":30}}).count()10、其餘:查找全部、去重、查找key爲null的項#一、查找全部db.user.find() #等同於db.user.find({})db.user.find().pretty()#二、去重db.user.find().distinct()#三、{'key':null} 匹配key的值爲null或者沒有這個keydb.t2.insert({'a':10,'b':111})db.t2.insert({'a':20})db.t2.insert({'b':null})db.t2.find({"b":null})#獲得的是b這個key的值爲null和沒有b這個key的文檔{ "_id" : ObjectId("5a5cc2a7c1b4645aad959e5a"), "a" : 20 }{ "_id" : ObjectId("5a5cc2a8c1b4645aad959e5b"), "b" : null }改:對已有的問當今進行修改的操做也叫更新,用upsate(),具體格式和參數以下:#update() 方法用於更新已存在的文檔。語法格式以下:db.collection.update(   <query>,   <update>,   {     upsert: <boolean>,     multi: <boolean>,     writeConcern: <document>   })#參數說明:對比update db1.t1 set name='EGON',sex='Male' where name='egon' and age=18;"""    query : 至關於where條件。    update : update的對象和一些更新的操做符(如$,$inc...等,至關於set後面的    upsert : 可選,默認爲false,表明若是不存在update的記錄則不更新也不插入,設置爲true表明不存在則添加。    multi : 可選,默認爲false,表明只更新找到的第一條記錄,設爲true時,表明更新找到的所有記錄。    writeConcern :可選,拋出異常的級別。"""#更新操做是不可分割的:若兩個更新同時發送,先到達服務器的先執行,而後執行另一個,不會破壞文檔。一、常規修改操做:#設數據爲{'name':'武松','age':18,'hobbies':['作煎餅','吃煎餅','賣煎餅'],'addr':{'country':'song','province':'shandong'}}#update db1.user set age=23,name="武大郎" where name="武松";#一、覆蓋式db.user.update(    {"name":"武松"},    {"age":23,"name":"武大郎"})#獲得的結果爲{"age":23,"name":"武大郎"}#二、局部修改:$setdb.user.update(    {"name":"武松"},    {"$set":{"age":15,"name":"潘金蓮"}})#獲得的結果爲{"name":"潘金蓮","age":15,'hobbies':['作煎餅','吃煎餅','賣煎餅']}#三、改多條:將multi參數設爲truedb.user.update(    {"_id":{"$gte":1,"$lte":2}},    {"$set":{"age":53,}},    {"multi":true})#四、有則修改,無則添加:upsert參數設爲truedb.user.update(    {"name":"EGON"},    {"$set":{"name":"EGON","age":28,}},    {"multi":true,"upsert":true})#五、修改嵌套文檔:將國家改成日本db.user.update(    {"name":"潘金蓮"},    {"$set":{"addr.country":"Japan"}})#六、修改數組:將第一個愛好改成洗澡db.user.update(    {"name":"潘金蓮"},    {"$set":{"hobbies.1":"洗澡"}})#刪除字段:不要愛好了db.user.update(    {"name":"潘金蓮"},    {"$unset":{"hobbies":""}}二、加減操做:$inc#增長和減小$inc#年齡都+1db.user.update(    {},    {"$inc":{"age":1}},    {"multi":true})#年齡都-10db.user.update(    {},    {"$inc":{"age":-10}},    {"multi":true})三、添加刪除數組內元祖$push  $pop  $pull$push的功能是往現有數組內添加元素#一、爲名字爲武大郎的人添加一個愛好readdb.user.update({"name":"武大郎"},{"$push":{"hobbies":"read"}})#二、爲名字爲武大郎的人一次添加多個愛好tea,dancingdb.user.update({"name":"武大郎"},{"$push":{    "hobbies":{"$each":["tea","dancing"]}}})$pop的功能是按照位置只能從頭或從尾即兩端刪元素,相似於隊列。1表明尾,-1表明頭#一、{"$pop":{"key":1}} 從數組末尾刪除一個元素db.user.update({"name":"武大郎"},{"$pop":{    "hobbies":1}})#二、{"$pop":{"key":-1}} 從頭部刪除db.user.update({"name":"武大郎"},{"$pop":{    "hobbies":-1}})$pull能夠自定義條件刪除db.user.update({'addr.country':"China"},{"$pull":{    "hobbies":"read"}},{    "multi":true})四、避免重複添加  $addToSet    即多個相同元素要求插入時只插入一條db.urls.insert({"_id":1,"urls":[]})db.urls.update(     {"_id":1},     {    "$addToSet":{        "urls":{        "$each":[            'http://www.baidu.com',            'http://www.baidu.com',            'http://www.xxxx.com'            ]            }        }    })五、瞭解部分#一、瞭解:限制大小"$slice",只留最後n個db.user.update({"_id":5},{    "$push":{"hobbies":{        "$each":["read",'music','dancing'],        "$slice":-2    }    }})#二、瞭解:排序The $sort element value must be either 1 or -1"db.user.update({"_id":5},{    "$push":{"hobbies":{        "$each":["read",'music','dancing'],        "$slice":-1,        "$sort":-1    }    }})#注意:不能只將"$slice"或者"$sort"與"$push"配合使用,且必須使用"$each"聚合操做:  咱們在查詢時確定會用到聚合,在MongoDB中聚合爲aggregate,聚合函數主要用到$match  $group  $avg  $project  $concat設咱們的數據庫中有這樣的數據from pymongo import MongoClientimport datetimeclient=MongoClient('mongodb://root:123@localhost:27017')table=client['db1']['emp']# table.drop()l=[('武大郎','male',18,'20170301','燒餅檢察官',7300.33,401,1),('武松','male',78,'20150302','公務員',1000000.31,401,1),('宋江','male',81,'20130305','公務員',8300,401,1),('林沖','male',73,'20140701','公務員',3500,401,1),('柴進','male',28,'20121101','公務員',2100,401,1),('盧俊義','female',18,'20110211','公務員',9000,401,1),('高俅','male',18,'19000301','公務員',30000,401,1),('魯智深','male',48,'20101111','公務員',10000,401,1),('史進','female',48,'20150311','打手',3000.13,402,2),('李逵','female',38,'20101101','打手',2000.35,402,2),('周通','female',18,'20110312','打手',1000.37,402,2),('石秀','female',18,'20160513','打手',3000.29,402,2),('李忠','female',28,'20170127','打手',4000.33,402,2),('吳用','male',28,'20160311','文人',10000.13,403,3),('蕭讓','male',18,'19970312','文人',20000,403,3),('安道全','female',18,'20130311','文人',19000,403,3),('公孫勝','male',18,'20150411','文人',18000,403,3),('朱貴','female',18,'20140512','文人',17000,403,3)]for n,item in enumerate(l):    d={        "_id":n,        'name':item[0],        'sex':item[1],        'age':item[2],        'hire_date':datetime.datetime.strptime(item[3],'%Y%m%d'),        'post':item[4],        'salary':item[5]    }    table.save(d)$match和 $group:至關於sql語句中的where和group by{"$match":{"字段":"條件"}},可使用任何經常使用查詢操做符$gt,$lt,$in等#例一、select * from db1.emp where post='公務員';db.emp.aggregate({"$match":{"post":"公務員"}})#例二、select * from db1.emp where id > 3 group by post;db.emp.aggregate(    {"$match":{"_id":{"$gt":3}}},    {"$group":{"_id":"$post",'avg_salary':{"$avg":"$salary"}}})#例三、select * from db1.emp where id > 3 group by post having avg(salary) > 10000;db.emp.aggregate(    {"$match":{"_id":{"$gt":3}}},    {"$group":{"_id":"$post",'avg_salary':{"$avg":"$salary"}}},    {"$match":{"avg_salary":{"$gt":10000}}}){"$group":{"_id":分組字段,"新的字段名":聚合操做符}}#一、將分組字段傳給$group函數的_id字段便可{"$group":{"_id":"$sex"}} #按照性別分組{"$group":{"_id":"$post"}} #按照職位分組{"$group":{"_id":{"state":"$state","city":"$city"}}} #按照多個字段分組,好比按照州市分組#二、分組後聚合得結果,相似於sql中聚合函數的聚合操做符:$sum、$avg、$max、$min、$first、$last#例1:select post,max(salary) from db1.emp group by post;db.emp.aggregate({"$group":{"_id":"$post","max_salary":{"$max":"$salary"}}})#例2:取每一個部門最大薪資與最低薪資db.emp.aggregate({"$group":{"_id":"$post","max_salary":{"$max":"$salary"},"min_salary":{"$min":"$salary"}}})#例3:若是字段是排序後的,那麼$first,$last會頗有用,比用$max和$min效率高db.emp.aggregate({"$group":{"_id":"$post","first_id":{"$first":"$_id"}}})#例4:求每一個部門的總工資db.emp.aggregate({"$group":{"_id":"$post","count":{"$sum":"$salary"}}})#例5:求每一個部門的人數db.emp.aggregate({"$group":{"_id":"$post","count":{"$sum":1}}})#三、數組操做符{"$addToSet":expr}#不重複{"$push":expr}#重複#例:查詢崗位名以及各崗位內的員工姓名:select post,group_concat(name) from db1.emp group by post;db.emp.aggregate({"$group":{"_id":"$post","names":{"$push":"$name"}}})db.emp.aggregate({"$group":{"_id":"$post","names":{"$addToSet":"$name"}}})$project:用於投射,即設定該鍵值對是否保留。1爲保留,0爲不保留,可對原有鍵值對作操做後增長自定義表達式{"$project":{"要保留的字段名":1,"要去掉的字段名":0,"新增的字段名":"表達式"}}#select name,post,(age+1) as new_age from db1.emp;db.emp.aggregate(    {"$project":{        "name":1,        "post":1,        "new_age":{"$add":["$age",1]}        }})#一、表達式之數學表達式{"$add":[expr1,expr2,...,exprN]} #相加{"$subtract":[expr1,expr2]} #第一個減第二個{"$multiply":[expr1,expr2,...,exprN]} #相乘{"$divide":[expr1,expr2]} #第一個表達式除以第二個表達式的商做爲結果{"$mod":[expr1,expr2]} #第一個表達式除以第二個表達式獲得的餘數做爲結果#二、表達式之日期表達式:$year,$month,$week,$dayOfMonth,$dayOfWeek,$dayOfYear,$hour,$minute,$second#例如:select name,date_format("%Y") as hire_year from db1.empdb.emp.aggregate(    {"$project":{"name":1,"hire_year":{"$year":"$hire_date"}}})#例如查看每一個員工的工做多長時間db.emp.aggregate(    {"$project":{"name":1,"hire_period":{        "$subtract":[            {"$year":new Date()},            {"$year":"$hire_date"}        ]    }}})#三、字符串表達式{"$substr":[字符串/$值爲字符串的字段名,起始位置,截取幾個字節]}{"$concat":[expr1,expr2,...,exprN]} #指定的表達式或字符串鏈接在一塊兒返回,只支持字符串拼接{"$toLower":expr}{"$toUpper":expr}db.emp.aggregate( {"$project":{"NAME":{"$toUpper":"$name"}}})#四、邏輯表達式$and$or$not排序:$sort、限制:$limit、跳過:$skip{"$sort":{"字段名":1,"字段名":-1}} #1升序,-1降序{"$limit":n}{"$skip":n} #跳過多少個文檔#例一、取平均工資最高的前兩個部門db.emp.aggregate({    "$group":{"_id":"$post","平均工資":{"$avg":"$salary"}}},{    "$sort":{"平均工資":-1}},{    "$limit":2})#例二、db.emp.aggregate({    "$group":{"_id":"$post","平均工資":{"$avg":"$salary"}}},{    "$sort":{"平均工資":-1}},{    "$limit":2},{    "$skip":1})隨機選取n個:$sample#集合users包含的文檔以下{ "_id" : 1, "name" : "dave123", "q1" : true, "q2" : true }{ "_id" : 2, "name" : "dave2", "q1" : false, "q2" : false  }{ "_id" : 3, "name" : "ahn", "q1" : true, "q2" : true  }{ "_id" : 4, "name" : "li", "q1" : true, "q2" : false  }{ "_id" : 5, "name" : "annT", "q1" : false, "q2" : true  }{ "_id" : 6, "name" : "li", "q1" : true, "q2" : true  }{ "_id" : 7, "name" : "ty", "q1" : false, "q2" : true  }#下述操做時從users集合中隨機選取3個文檔db.users.aggregate(   [ { $sample: { size: 3 } } ])
相關文章
相關標籤/搜索