MongoDB的使用
數(shù)據(jù)準(zhǔn)備與錄入
client = pymongo.MongoClient(host="localhost", port=27017)
db = client.mytest
collection = db.users
genders = ["male", "female"]
hobbies = ["sing", "enjoy", "work", "dancing", "writering", "art", "jumps", "eating", "drinking", "watches", "car",
"woman", "hanzi", "technology", "computer", "code", "backend", "front", "chinese", "mobile", "build"]
descript = ["做個(gè)難相處的人,盡情盡興的給討厭的人甩臉子",
"光明正大給喜歡的人說(shuō)情話",
"情愿少活幾年,只想痛快一點(diǎn)",
"女人,別活的跟支煙似的,讓人無(wú)聊時(shí)點(diǎn)起你,抽完了又彈飛你",
"你要活得和毒品一樣,要么不能棄,要么惹不起",
"我不是對(duì)誰(shuí)都三言兩語(yǔ),我不是對(duì)誰(shuí)都好脾氣",
"我不是對(duì)誰(shuí)都念舊情,當(dāng)我慣著你的時(shí)候請(qǐng)珍惜",
"你讓我明白什么叫做不擇手段,我也會(huì)讓你明白什么叫做以牙還牙",
"如果這輩子你沒(méi)得罪過(guò)人,也說(shuō)明這輩子你也沒(méi)干成過(guò)什么事",
"現(xiàn)在的你要是多學(xué)一樣本事,以后的你就能少說(shuō)一句求人的話",
"只有自己強(qiáng)大,才不會(huì)被人踐踏",
"夢(mèng)想是注定孤獨(dú)的旅行,路上少不了質(zhì)疑和嘲笑",
"哪怕遍體鱗傷,也要活得漂亮",
"別總因?yàn)檫w就別人就委屈自己,這個(gè)世界沒(méi)幾個(gè)人值得你總彎腰",
"彎腰的時(shí)間久了,只會(huì)讓人習(xí)慣于你的低姿態(tài),你的不重要",
"我從來(lái)不喜歡和別人爭(zhēng)東西,你喜歡就拿去,前提是你能拿得走",
"你不是人民幣,做不到人人都喜歡,你活著就要讓討厭你的人越來(lái)越不爽",
"沒(méi)有人天生脾氣好,要不是你很重要,我早就一巴掌上去了",
"學(xué)會(huì)絕情,該走的就走,該留的就留",
"我是一個(gè)很有原則的人,我的原則只有三個(gè)字,看心情",
"我連最愛(ài)的長(zhǎng)發(fā)都剪短了,還有什么是不能放棄的",
"謝謝你們的冷嘲熱諷,讓我懂得現(xiàn)實(shí)的殘酷",
"人需要點(diǎn)脾氣,才能活出志氣",
]
alls = [chr(i) for i in range(48,58)] + [chr(i) for i in range(97, 123)]
numb = 0
for i in range(50):
info_lst = []
for j in range(100):
info = {}
numb += 1
info["id"] = numb
info["name"] = ''.join(random.sample(alls, 8))
info["age"] = random.randint(18, 50)
info["gender"] = random.choice(genders)
info["hobby"] = random.sample(hobbies, 4)
info["brief"] = random.choice(descript)
info_lst.append(info)
collection.insert_many(info_lst)
數(shù)據(jù)庫(kù)操作
> show dbs
admin 0.000GB
config 0.000GB
digital_library 0.000GB
local 0.000GB
mytest 0.001GB
> use digital_library
switched to db digital_library
> show tables
content
detail
> db.dropDatabase()
{ "dropped" : "ku2", "ok" : 1 }
集合(數(shù)據(jù)表)操作
創(chuàng)建集合
db.集合名.insert({"字段名": "字段值"}) 就可以創(chuàng)建集合
刪除集合
db.集合名.drop()
> db.test2.drop()
true
數(shù)據(jù)行操作
增
插入單條數(shù)據(jù)
> db.test2.insert({"字段信息":"字段值"})
WriteResult({ "nInserted" : 1 })
> db.test2.find({})
{ "_id" : ObjectId("5d1ec321f3decc3adabe3587"), "name" : "what" }
{ "_id" : ObjectId("5d1ed49cf3decc3adabe3589"), "字段信息" : "字段值" }
插入多條數(shù)據(jù)
> db.test2.insertMany( [ {"字段信息1":"字段值1"}, {"字段信息2":"字段值2"}, {"字段信息3": "字段值3"} ] ))
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("5d1ed5e9f3decc3adabe358a"),
ObjectId("5d1ed5e9f3decc3adabe358b"),
ObjectId("5d1ed5e9f3decc3adabe358c")
]
}
> db.test2.find()
{ "_id" : ObjectId("5d1ec321f3decc3adabe3587"), "name" : "what" }
{ "_id" : ObjectId("5d1ed49cf3decc3adabe3589"), "字段信息" : "字段值" }
{ "_id" : ObjectId("5d1ed5e9f3decc3adabe358a"), "字段信息1" : "字段值1" }
{ "_id" : ObjectId("5d1ed5e9f3decc3adabe358b"), "字段信息2" : "字段值2" }
{ "_id" : ObjectId("5d1ed5e9f3decc3adabe358c"), "字段信息3" : "字段值3" }
查
比較運(yùn)算
SQL:=,!=,>,<,>=,<=
MongoDB:{key:value} ,"$ne", "$gt", "$lt", "gte", "lte", 上下依次對(duì)應(yīng), 其中"$ne"能用于所有數(shù)據(jù)類型
> db.users.find()
sql => select * from users;
> db.users.find({"name":"z35wl6yq"})
{ "_id" : ObjectId("5d1eb83b69d0d77b7292f56c"), "id" : 18, "name" : "z35wl6yq", "age" : 19, "gender" : "female", "hobby" : [ "work", "enjoy", "drinking", "art" ], "brief" : "沒(méi)有人天生脾氣好,要不是你很重要,我早就一巴掌上去了" }
sql => select * from users where name = "z35wl6yq";
> db.users.find({"name":{"$ne":"z35wl6yq"}})
sql => select * from users where name != "z35wl6yq";
> db.users.find({"id":{"$gt":4500}})
sql => select * from users where id > 4500;
> db.users.find({"id":{"$lt":4500}})
sql => select * from users where id < 4500;
and, or, not 運(yùn)算
SQL:and,or,not
MongoDB:字典中逗號(hào)分隔的多個(gè)條件是and關(guān)系,"$or"的條件放到 [ ] 內(nèi),"$not"
> db.users.find({'id':{"$gte":2000,"$lte":4000}})
sql => select * from users where id >= 2000 and id <= 4000;
> db.users.find({"id":{"$gte":4000}, "age":35})
> db.users.find({"id":{"$gte":4000},"age":{"$lt":30}}) 1
> db.users.find({
"$and":[
{"id":{"$gte":4000}},
{"age":{"$lt":30}}
] }) 2
1,2條語(yǔ)句相同
sql => select * from users where id >= 4000 and age <= 30;
> db.users.find({"$or":[
{"id":{"$gte": 3500}},
{"age":{"$lt": 30}}
] })
sql => select * from users where id >= 3500 or age < 30;
> db.users.find({"id":{"$mod":[5,1]}})
sql => select * from users where id % 5 = 1;
> db.users.find({"id":{"$not":{"$mod":[5,1]}}})
sql => select * from users where id % 5 != 1;
in, not in
db.users.find({"age":{"$in":[20,30,40,50]}})
sql => select * from users where age in [20,30,40,50];
db.users.find({"age":{"$nin":[20,30,40,50]}})
sql => select * from users where age not in [20,30,40,50];
正則匹配
> db.users.find({"name": /su2mia/i}) 只要name包含了"su2mia"都能匹配到
sql => select * from users where name regexp "/wu2mias1/";
> db.user.find({'name': /^j.*?(g|n)$/i})
sql => select * from users where name regexp '^j.*?(g|n)$';
獲取指定字段
第1個(gè){}: 篩選條件 第2個(gè){}:獲取字段
1: 顯示 0: 不顯示
> db.users.find({"id":3520}, {"name":1, "age":1, "brief":1, "_id":0})
sql => select name,age,brief from users where id = 3520;
> db.users.find({},{"name":1, "_id":0})
sql => select name from users;
查詢數(shù)組
查看有dancing愛(ài)好的人
> db.users.find({"hobby":"dancing"})
查看既有dancing又有art愛(ài)好的人
> db.users.find({
"hobby": {
"$all": ["dancing","art']}
})
查看第4個(gè)愛(ài)好為art的人
> db.users.find({"hobby.3":"art"})
查看所有人最后兩個(gè)愛(ài)好
> db.users.find({}, {"hobby": {"$slice":-2}})
查看所有人的第2個(gè)到第3個(gè)愛(ài)好
> db.users.find({}, {"hobby": {"$slice": [1,2]}})
排序
按年齡升序排列
> db.users.find().sort({"age":1})
年齡相同時(shí), 按id降序排列
> db.users.find().sort({"age":1,"id":-1})
查詢數(shù)量
兩者皆可
> db.users.count({"age":{"$gt":30}})
> db.users.find({"age":{"$gt":30}}).count()
其他
findOne: 找到符合條件的第一個(gè)
> db.users.findOne({"id":{"$gt":500}})
改
update() 語(yǔ)法
update() 方法用于更新已存在的文檔。語(yǔ)法格式如下:
db.collection.update(
?<query>,
?<update>,
?{
? upsert: <boolean>,
?multi: <boolean>,
?writeConcern: <document>
?}
)
參數(shù)說(shuō)明:
對(duì)比sql語(yǔ)句:update db1.t1 set name='EGON',sex='Male' where name='egon' and age=18;
query : 相當(dāng)于where條件。
update : update的對(duì)象和一些更新的操作符(如inc...等,相當(dāng)于set后面的
upsert : 可選,默認(rèn)為false,代表如果不存在update的記錄不更新也不插入,設(shè)置為true代表插入。
multi : 可選,默認(rèn)為false,代表只更新找到的第一條記錄,設(shè)為true,代表更新找到的全部記錄。
writeConcern :可選,拋出異常的級(jí)別。
更新操作是不可分割的:若兩個(gè)更新同時(shí)發(fā)送,先到達(dá)服務(wù)器的先執(zhí)行,然后執(zhí)行另外一個(gè),不會(huì)破壞文檔。
覆蓋更新
注意:除非是刪除,否則_id是始終不會(huì)變的
1:
db.user.update({'age':20},{"name":"Wxx","hobbies_count":3})
是用{"id":2,"name":"Wxx","hobbies_count":3}覆蓋原來(lái)的記錄
2:
一種最簡(jiǎn)單的更新就是用一個(gè)新的文檔完全替換匹配的文檔。這適用于大規(guī)模式遷移的情況。例如
var obj=db.user.findOne({"id":2})
obj.username=obj.name+'nb'
obj.hobbies_count++
delete obj.age
db.user.update({"id":2},obj)
局部更新(用的最多)
設(shè)置:$set
通常文檔只會(huì)有一部分需要更新。可以使用原子性的更新修改器,指定對(duì)文檔中的某些字段進(jìn)行更新。
更新修改器是種特殊的鍵,用來(lái)指定復(fù)雜的更新操作,比如修改、增加或者刪除
名字為 r63izxc7 的這個(gè)人的年齡改為125歲
db.users.update({"name":"r63izxc7"}, {"$set": {"age":125}})
sql => update users set age =125 where name = "r63izxc7";
{"upsert": true} -- 沒(méi)有就新增
修改名字為 yiyahaiha 的這個(gè)人的信息,如果這個(gè)人不存在就新增這個(gè)人的信息
db.users.update({"name":"yiyahaiha"}, {"$set": {"id":200, "age":56, "gender":"male", "hobby": []}}, {"upsert": true})
update 默認(rèn)只修改匹配成功的第一條信息
{"multi": true} -- 修改多條
把年齡超過(guò)100歲的人 年齡修改為88
db.users.update({"age":{"$gt":100}}, {"$set": {"age": 88}}, {"multi": true})
修改內(nèi)嵌文檔 (即修改字典信息)
把名字為 quz0ode9 的人所在的省份改成廣州
db.user.update({'name':"quz0ode9"}, {"$set": {"addr.province":"Guangzhou"}})
修改列表信息
把名字為 ljp5zwqm 的人 第3個(gè)愛(ài)好改為 writeeeeeeeee
db.users.update({"name":"ljp5zwqm"}, {"$set": {"hobby.2": "writeeeeeeeee"}})
刪除某字段信息 ?$unset
刪除名為 yiyahaiha 的愛(ài)好字段
db.users.update({"name": "yiyahaiha"}, {"$unset": {"hobby": ""}})
自增或自減 ?$inc
id大于100小于200的人的年齡自增100 (自減100 即 增-100)
db.users.update({"id": {"$gt": 100, "$lt": 200}}, {"$inc": {"age": 100}}, {"multi": true})
添加或刪除列表內(nèi)元素:$push, $pop, $pull
1.往數(shù)組內(nèi)添加一個(gè)元素: $push
往名為 heiha 的人的愛(ài)好中添加一個(gè) ball 的愛(ài)好
db.users.update({"name": "heiha"}, {"$push": {"hobby": "ball"}})
- 往數(shù)組中添加多個(gè)元素: $push 配合 $each
往名字為 heiha 的人一次添加多個(gè)愛(ài)好 tea,dancing
db.users.update({"name": "heiha"},
{"$push":
{"hobby": {"$each": ["tea", "dancing"]}
}
})
- 只能從開(kāi)頭或結(jié)尾刪除元素: $pop
1 : 從末尾刪 ? ?-1:從頭刪
刪除列表元素
db.users.update({"name": "heiha"}, {"$pop":{"hobby": -1}}) # 刪列表第一個(gè)元素
db.users.update({"name": "heiha"}, {"$pop":{"hobby": 1}}) # 刪列表最后一個(gè)元素
- 按照條件刪除元素,把符合條件的元素全刪了:$pull
刪除年齡大于 145 的人的 開(kāi)車 愛(ài)好
db.users.update(
{"age": {"$gt": 145}},
{"$pull":
{"hobby": "car"}},
{"multi": true}
)
避免重復(fù)添加 : $addToSet
為id為1的人添加如下愛(ài)好
db.users.update(
{"id": 1},
{"$addToSet":
{"hobby":
{"$each": ["mobile", "cat", "back", "front"]}
}
}
)
刪
刪除多個(gè)中的第一個(gè)
db.user.deleteOne({ 'age': 50 })
刪除省份為 shenzhen 的全部信息
db.user.deleteMany({'addr.country': 'China'})
刪除愛(ài)好中有 art 的全部信息
db.user.deleteMany({'hobby': 'art'})
刪除全部
db.user.deleteMany({})