MongoDB的詳細(xì)使用

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"}})
  1. 往數(shù)組中添加多個(gè)元素: $push 配合 $each
往名字為 heiha 的人一次添加多個(gè)愛(ài)好 tea,dancing
db.users.update({"name": "heiha"}, 
        {"$push": 
                {"hobby": {"$each": ["tea", "dancing"]}
        }
})
  1. 只能從開(kāi)頭或結(jié)尾刪除元素: $pop
    1 : 從末尾刪 ? ?-1:從頭刪
刪除列表元素
db.users.update({"name": "heiha"}, {"$pop":{"hobby": -1}})        # 刪列表第一個(gè)元素
db.users.update({"name": "heiha"}, {"$pop":{"hobby": 1}})         # 刪列表最后一個(gè)元素
  1. 按照條件刪除元素,把符合條件的元素全刪了:$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({})

pymongo操作數(shù)據(jù)庫(kù)

參考: https://api.mongodb.com/python/current/tutorial.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • PHPStorm的使用姿勢(shì) 2017-05-23 工具 工具 俗話說(shuō),工欲善其事必先利其器。作為一名碼農(nóng),合適開(kāi)發(fā)...
    大海244閱讀 178評(píng)論 0 0
  • 1.安裝系統(tǒng)包和部分軟件包 yum -y install patch make gcc gcc-c++ gcc-g...
    彬榮閱讀 349評(píng)論 0 0
  • Docker 學(xué)習(xí)筆記 - 端口映射與容器互聯(lián) 作者:馬燕龍 時(shí)間:2017-11-06 分類:Docker 一、...
    大海244閱讀 365評(píng)論 0 0
  • [js獲取ip地址,操作系統(tǒng),瀏覽器版本等信息,可兼容 這次呢,說(shuō)一下使用js獲取用戶電腦的ip信息,剛開(kāi)始只是想...
    1263536889閱讀 141評(píng)論 0 0
  • 多的差點(diǎn)畫不下,不過(guò)整理了之后清晰多了?? 還有一種方法就是按顏色分類哦~ 有的同學(xué)色彩記憶強(qiáng)就可以采用這種方式~ ...
    AmberCharles閱讀 336評(píng)論 0 0

友情鏈接更多精彩內(nèi)容