日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

数据库——MongoDB增删改查

發布時間:2025/3/15 数据库 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据库——MongoDB增删改查 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

MongoDB增刪改查操作

  本文包含對數據庫、集合以及文檔的基本增刪改查操作

數據庫操作

#1、增 use config #如果數據庫不存在,則創建并切換到該數據庫,存在則直接切換到指定數據庫。#2、查 show dbs #查看所有數據庫,相當于Mysql的show databases #空數據庫不會顯示在列表中比如默認創建的數據庫config, 要顯示,就必須在庫中插入數據 db #查看當前所在庫#3、刪 use config #先切換到要刪的庫下 db.dropDatabase() #刪除當前庫

?

集合操作

#1、增 use db1#選擇所在數據庫 #方式一: db.table1.insert({'a':1})#當第一個文檔插入時,集合就會被創建并包含該文檔 #方式二: db.table2#創建一個空集合#2、查 show collections show tables#兩者等價#3、刪 db.table1.drop()#集合沒有改的操作

?

文檔操作

  文檔的操作可以看成是對字典的操作

增:增加時沒有指定_id則默認ObjectId,_id不能重復,且在插入后不可變

  單條增加

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'} }user3={"_id":3,"name":"yuanhao","age":30,'hobbies':['music','drink'],'addr':{'country':'China','city':'heibei'} }user4={"_id":4,"name":"jingliyang","age":40,'hobbies':['music','read','dancing','tea'],'addr':{'country':'China','city':'BJ'} }user5={"_id":5,"name":"jinxin","age":50,'hobbies':['music','read',],'addr':{'country':'China','city':'henan'} } db.user.insertMany([user1,user2,user3,user4,user5]) 批量增加

?

刪:

#1、刪除符合條件的第一個文檔 db.user.deleteOne({ 'age': 8 })#第一個包含有 'age': 8的文檔#2、刪除符合條件的全部 db.user.deleteMany( {'addr.country': 'China'} ) #只要有內嵌文檔,且內容含有country': 'China'的全都刪除 db.user.deleteMany({"_id":{"$gte":3}})#刪除id大于等于3的所有#3、刪除全部 db.user.deleteMany({}) #等于是清空該集合(表)

?

查:

  查的形式有很多,如比較運算、邏輯運算、成員運算、取指定字段、對數組的查詢、使用正則、獲取數量,還有排序、分頁等等。下面我們針對十種查的形式進行詳細說明。

注:在MongoDB中,用到方法都得用 $ 符號開頭

一、比較運算:=,!= ('$ne') ,> ('$gt') ,< ('$lt') ,>= ('$gte')?,<=?('$lte')

=,!= ('$ne') ,> ('$gt') ,< ('$lt') ,>= ('$gte') ,<= ('$lte') #1、select * from db1.user where id = 3 db.user.find({"_id":3})#2、select * from db1.user where id != 3 db.user.find({"_id":{"$ne":3}})#3、select * from db1.user where id > 3 db.user.find({"_id":{"$gt":3}})#4、select * from db1.user where age < 3 db.user.find({"age":{"$lt":3}})#5、select * from db1.user where id >= 3 db.user.find({"_id":{"$gte":3}})#6、select * from db1.user where id <= 3 db.user.find({"_id":{"$lte":3}})

?

二、邏輯運算:MongoDB中字典內用逗號分隔多個條件是and關系,或者直接用$and,$o,r$not(與或非)

#邏輯運算:$and,$or,$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]}} }) 邏輯運算:$and,$or,$not

?

三、成員運算:成員運算無非in和not in,MongoDB中形式為$in , $nin

#1、select * from db1.user where age in (20,30,31); db.user.find({"age":{"$in":[20,30,31]}})#2、select * from db1.user where name not in ('alex','yuanhao'); db.user.find({"name":{"$nin":['Stefan','Damon']}})

?

四、正則:正則定義在/ /內

# MongoDB: /正則表達/i#1、select * from db1.user where name regexp '^j.*?(g|n)$'; db.user.find({'name':/^j.*?(g|n)$/i})#匹配規則:j開頭、g或n結尾,不區分大小寫

?

五、查看指定字段:0表示不顯示1表示顯示

#1、select name,age from db1.user where id=3; db.user.find({'_id':3},{'_id':0,'name':1,'age':1})#2、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 } )

?

六、對數組的查詢:

#查詢數組相關 #查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" } ) View Code

?

七、對查詢結果進行排序:sort() ?1代表升序、-1代表降序

db.user.find().sort({"name":1,}) db.user.find().sort({"age":-1,'_id':1})

?

八、分頁: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)#第五個和第六個

?

九、獲取數量:count()

#查詢年齡大于30的人數 #方式一: db.user.count({'age':{"$gt":30}}) #方式二: db.user.find({'age':{"$gt":30}}).count()

?

十、其他:查找所有、去重、查找key為null的項

#1、查找所有 db.user.find() #等同于db.user.find({}) db.user.find().pretty() #2、去重 db.user.find().distinct()#3、{'key':null} 匹配key的值為null或者沒有這個key db.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 :可選,拋出異常的級別。 """ #更新操作是不可分割的:若兩個更新同時發送,先到達服務器的先執行,然后執行另外一個,不會破壞文檔。

?

1、常規修改操作:

#設數據為{'name':'武松','age':18,'hobbies':['做煎餅','吃煎餅','賣煎餅'],'addr':{'country':'song','province':'shandong'}} #update db1.user set age=23,name="武大郎" where name="武松"; #1、覆蓋式 db.user.update({"name":"武松"},{"age":23,"name":"武大郎"} ) #得到的結果為{"age":23,"name":"武大郎"}#2、局部修改:$set db.user.update({"name":"武松"},{"$set":{"age":15,"name":"潘金蓮"}} ) #得到的結果為{"name":"潘金蓮","age":15,'hobbies':['做煎餅','吃煎餅','賣煎餅']}#3、改多條:將multi參數設為true db.user.update({"_id":{"$gte":1,"$lte":2}},{"$set":{"age":53,}},{"multi":true} ) #4、有則修改,無則添加:upsert參數設為true db.user.update({"name":"EGON"},{"$set":{"name":"EGON","age":28,}},{"multi":true,"upsert":true} )#5、修改嵌套文檔:將國家改為日本 db.user.update({"name":"潘金蓮"},{"$set":{"addr.country":"Japan"}} )#6、修改數組:將第一個愛好改為洗澡 db.user.update({"name":"潘金蓮"},{"$set":{"hobbies.1":"洗澡"}} )#刪除字段:不要愛好了 db.user.update({"name":"潘金蓮"},{"$unset":{"hobbies":""}} )

?

2、加減操作:$inc

#增加和減少$inc #年齡都+1 db.user.update({},{"$inc":{"age":1}},{"multi":true} ) #年齡都-10 db.user.update({},{"$inc":{"age":-10}},{"multi":true} )

?

3、添加刪除數組內元祖$push ?$pop ?$pull

  $push的功能是往現有數組內添加元素

#1、為名字為武大郎的人添加一個愛好read db.user.update({"name":"武大郎"},{"$push":{"hobbies":"read"}})#2、為名字為武大郎的人一次添加多個愛好tea,dancing db.user.update({"name":"武大郎"},{"$push":{"hobbies":{"$each":["tea","dancing"]} }})

  $pop的功能是按照位置只能從頭或從尾即兩端刪元素,類似于隊列。1代表尾,-1代表頭

#1、{"$pop":{"key":1}} 從數組末尾刪除一個元素 db.user.update({"name":"武大郎"},{"$pop":{"hobbies":1} })#2、{"$pop":{"key":-1}} 從頭部刪除 db.user.update({"name":"武大郎"},{"$pop":{"hobbies":-1} })

  $pull可以自定義條件刪除

db.user.update({'addr.country':"China"},{"$pull":{"hobbies":"read"} }, {"multi":true } )

?

4、避免重復添加 ?$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']}}} ) View Code

?

5、了解部分

#1、了解:限制大小"$slice",只留最后n個 db.user.update({"_id":5},{"$push":{"hobbies":{"$each":["read",'music','dancing'],"$slice":-2}} })#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" $slice $sort $each

?

聚合操作:

  我們在查詢時肯定會用到聚合,在MongoDB中聚合為aggregate,聚合函數主要用到$match ?$group ?$avg ?$project ?$concat

設我們的數據庫中有這樣的數據

from pymongo import MongoClient import 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等#例1、select * from db1.emp where post='公務員'; db.emp.aggregate({"$match":{"post":"公務員"}})#例2、select * from db1.emp where id > 3 group by post; db.emp.aggregate({"$match":{"_id":{"$gt":3}}},{"$group":{"_id":"$post",'avg_salary':{"$avg":"$salary"}}} )#例3、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}}} ) View Code {"$group":{"_id":分組字段,"新的字段名":聚合操作符}}#1、將分組字段傳給$group函數的_id字段即可 {"$group":{"_id":"$sex"}} #按照性別分組 {"$group":{"_id":"$post"}} #按照職位分組 {"$group":{"_id":{"state":"$state","city":"$city"}}} #按照多個字段分組,比如按照州市分組#2、分組后聚合得結果,類似于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}}})#3、數組操作符 {"$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"}}}) $group具體

$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]}} }) View Code #1、表達式之數學表達式 {"$add":[expr1,expr2,...,exprN]} #相加 {"$subtract":[expr1,expr2]} #第一個減第二個 {"$multiply":[expr1,expr2,...,exprN]} #相乘 {"$divide":[expr1,expr2]} #第一個表達式除以第二個表達式的商作為結果 {"$mod":[expr1,expr2]} #第一個表達式除以第二個表達式得到的余數作為結果#2、表達式之日期表達式:$year,$month,$week,$dayOfMonth,$dayOfWeek,$dayOfYear,$hour,$minute,$second #例如:select name,date_format("%Y") as hire_year from db1.emp db.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"}]}}} )#3、字符串表達式 {"$substr":[字符串/$值為字符串的字段名,起始位置,截取幾個字節]} {"$concat":[expr1,expr2,...,exprN]} #指定的表達式或字符串連接在一起返回,只支持字符串拼接 {"$toLower":expr} {"$toUpper":expr}db.emp.aggregate( {"$project":{"NAME":{"$toUpper":"$name"}}})#4、邏輯表達式 $and $or $not 更多自定義表達式

排序:$sort、限制:$limit、跳過:$skip

{"$sort":{"字段名":1,"字段名":-1}} #1升序,-1降序 {"$limit":n} {"$skip":n} #跳過多少個文檔#例1、取平均工資最高的前兩個部門 db.emp.aggregate( {"$group":{"_id":"$post","平均工資":{"$avg":"$salary"}} }, {"$sort":{"平均工資":-1} }, {"$limit":2 } ) #例2、 db.emp.aggregate( {"$group":{"_id":"$post","平均工資":{"$avg":"$salary"}} }, {"$sort":{"平均工資":-1} }, {"$limit":2 }, {"$skip":1 } ) 排序:$sort、限制:$limit、跳過:$skip

隨機選取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 } } ] ) 隨機選取n個:$sample

?

增刪改查練習

1. 查詢崗位名以及各崗位內的員工姓名 2. 查詢崗位名以及各崗位內包含的員工個數 3. 查詢公司內男員工和女員工的個數 4. 查詢崗位名以及各崗位的平均薪資、最高薪資、最低薪資 5. 查詢男員工與男員工的平均薪資,女員工與女員工的平均薪資 6. 查詢各崗位內包含的員工個數小于2的崗位名、崗位內包含員工名字、個數 7. 查詢各崗位平均薪資大于10000的崗位名、平均工資 8. 查詢各崗位平均薪資大于10000且小于20000的崗位名、平均工資 9. 查詢所有員工信息,先按照age升序排序,如果age相同則按照hire_date降序排序 10. 查詢各崗位平均薪資大于10000的崗位名、平均工資,結果按平均薪資升序排列 11. 查詢各崗位平均薪資大于10000的崗位名、平均工資,結果按平均薪資降序排列,取前1個 1. 查詢崗位名以及各崗位內的員工姓名 db.emp.aggregate({"$group":{"_id":"$post","names":{"$push":"$name"}}})2. 查詢崗位名以及各崗位內包含的員工個數 db.emp.aggregate({"$group":{"_id":"$post","count":{"$sum":1}}})3. 查詢公司內男員工和女員工的個數 db.emp.aggregate({"$group":{"_id":"$sex","count":{"$sum":1}}})4. 查詢崗位名以及各崗位的平均薪資、最高薪資、最低薪資 db.emp.aggregate({"$group":{"_id":"$post","avg_salary":{"$avg":"$salary"},"max_salary":{"$max":"$salary"},"min_salary":{"$min":"$salary"}}})5. 查詢男員工與男員工的平均薪資,女員工與女員工的平均薪資 db.emp.aggregate({"$group":{"_id":"$sex","avg_salary":{"$avg":"$salary"}}})6. 查詢各崗位內包含的員工個數小于2的崗位名、崗位內包含員工名字、個數 db.emp.aggregate( {"$group":{"_id":"$post","count":{"$sum":1},"names":{"$push":"$name"}} }, {"$match":{"count":{"$lt":2}}}, {"$project":{"_id":0,"names":1,"count":1}} )7. 查詢各崗位平均薪資大于10000的崗位名、平均工資 db.emp.aggregate( {"$group":{"_id":"$post","avg_salary":{"$avg":"$salary"}} }, {"$match":{"avg_salary":{"$gt":10000}}}, {"$project":{"_id":1,"avg_salary":1}} )8. 查詢各崗位平均薪資大于10000且小于20000的崗位名、平均工資 db.emp.aggregate( {"$group":{"_id":"$post","avg_salary":{"$avg":"$salary"}} }, {"$match":{"avg_salary":{"$gt":10000,"$lt":20000}}}, {"$project":{"_id":1,"avg_salary":1}} )9. 查詢所有員工信息,先按照age升序排序,如果age相同則按照hire_date降序排序 db.emp.aggregate( {"$sort":{"age":1,"hire_date":-1}} )10. 查詢各崗位平均薪資大于10000的崗位名、平均工資,結果按平均薪資升序排列 db.emp.aggregate( {"$group":{"_id":"$post","avg_salary":{"$avg":"$salary"}} }, {"$match":{"avg_salary":{"$gt":10000}}}, {"$sort":{"avg_salary":1}} )11. 查詢各崗位平均薪資大于10000的崗位名、平均工資,結果按平均薪資降序排列,取前1個 db.emp.aggregate( {"$group":{"_id":"$post","avg_salary":{"$avg":"$salary"}} }, {"$match":{"avg_salary":{"$gt":10000}}}, {"$sort":{"avg_salary":-1}}, {"$limit":1}, {"$project":{"date":new Date,"平均工資":"$avg_salary","_id":0}} ) 答案

?

轉載于:https://www.cnblogs.com/zhuminghui/p/8330429.html

總結

以上是生活随笔為你收集整理的数据库——MongoDB增删改查的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。