pymongo的簡單使用

pymongo的使用

首先安裝:python

pip install pymongo

安裝好了使用mongodb

import pymongo

# 連接mongodb,獲得一個mongoclient的客戶端對象
client = pymongo.MongoClient()

# 指定數據庫
db = client.test
db = client["test"]   # 這兩種方式均可以指定數據庫,若是沒有該數據庫的話,會自行建立
# 若是瞭解面向對象的一些魔法(內置)方法的話,大概可以知道client對應的類,確定重寫__getattr__,和__getitem__方法

# 指定集合
collection = db.users
collection = db["users"]   # 一樣這兩種方法均可以指定到集合,不存在會自行建立

知道了數據庫和集合,下面就是對文檔的操做了數據庫

# 接着上面的內容

# 插入文檔
result = collection.insert({"name":"zhuchunyu","age":22})
# 返回值就是一個對象,輸出效果爲ObjectId('5cde10c2e200928c8fa29315')
result = collection.insert([{"name":"zhanghao","age":22},{"name":"dsb","age":22}])
# 上面這行代碼是插入多個文檔,返回值就是一個list,裏面元素就是一個一個的對象
# insert這個方法能夠插入多條文檔,也能夠插入單條文檔

# 插入單條文檔
result = collection.insert_one({"name":"zhuchunyu","age":22})
result.inserted_id
# 返回值也是一個對象,可是這個對象和上面返回值是不同的,本身能夠type(result)看看

# 插入多條文檔
results = collection.insert_many([{"name":"wuyang","age":21},{"name":"yangjingpeng","age":22}])
# 返回值也是一個對象


# 查詢文檔
# 大概就是兩個方法,find(),find_one()

# find()方法,返回值爲一個對象
result = collection.find({})   # 將集合裏的全部文檔都查詢出來
result = collection.find({"name":"zhuyu"})  # 查詢符合參數一的條件的文檔
# 能夠經過for循環將文檔依次打印出來
for i in result:
    print(i)
    
# find_one(),查詢一條文檔,返回值就是一個字典,裏面就是文檔內容
result = collection.find_one({})   # 只返回符合條件的一個文檔數據
# 其實它最終仍是調用的是find()方法,經過limit拿到一條文檔數據

# 這兩個方法大概能知道作什麼事了,下面繼續看方法裏的參數,此次是重點
# 無論是find_one()仍是find(),他們最終執行的就是dind()這個方法,咱們看這個方法的參數就好了

# find()這個方法,最終返回的就是Cursor這個類的對象,最好是先本身看看源碼,咱們繼續看這個類
# 咱們主要看這兩個參數 filter,和projection

# filter就是咱們的查詢條件,projection就是指定返回文檔的哪些字段數據
# 有這樣格式文檔數據的集合,文檔不止下面這一條,有不少
{
       _id: 4,
       name: "xi",
       age: 34,
       type: 2,
       status: "D",
       favorites: { artist: "Chagall", food: "chocolate" },
       finished: [ 5, 11 ],
       badges: [ "red", "black" ],
       points: [
          { points: 53, bonus: 15 },
          { points: 51, bonus: 15 }
       ]
}

# 當前這個集合的名字賦值給了collection這個變量
# 查詢出name字段爲"xi"的全部文檔
res = collection.find({"name":"xi"})

# 查詢age字段大於20的全部文檔數據
res = collection.find({"age":{"$gt":20}})

# 查詢status字段爲"D",且age字段小於50的全部文檔
res = collection.find({"status":"D","age":{"$lt":50}})

# 查詢status字段爲"D",或者age字段小於50的全部文檔
res = collection.find({"$or":[{"status":"D"},{"age":{"$lt":50}}]})

# 查詢age字段大於30小於50的文檔
res = collection.find({"age": {"$lt": 50, "$gt": 30}})

# 查詢finished字段數組有5這個元素的文檔
res = collection.find({"finished": 5})

# 查詢favorites字段裏的文檔artist字段爲"Chagall"的文檔
res = collection.find({"favorites.artist": "Chagall"})

# 查詢points字段裏的文檔字段points爲53,而且bonus字段爲15的文檔
res = collection.find({"points.points": 53, "points.bonus": 15})

# projection就是指定返回文檔的哪些字段數據
# 這是第二個參數,傳遞一個字典,key就是字段名,value就是0或1,0表明不須要,1表明須要
# 好比上面那個例子,我想查詢name字段爲"xi",且我只須要name,age這兩個字段
res = collection.find({"name":"xi"},{"name":1,"age":"1","_id":0})

#注意:find()返回值是Cursor這個類的對象,res能夠繼續使用該對象裏的方法,咱們經過print,或者for循環這個對象,只是觸發了它裏面的一些內置方法。

# 更新文檔
# 大概就是update,update_one,update_many

# update(),至少傳遞兩個參數,參數一就是filter(篩選條件),參數二就是更新後的文檔
# 好比我有這樣的一條文檔{"name":"zhuyu","age":22...}
# 我想把這條文檔的age字段改成23,其餘的字段數據不發生變化
res_dict = collection.find_one({"name":"zhuyu"})
res_dict["age"] = 23
collection.update({"name":"zhuyu"},res_dict)
# 對了,就算根據篩選條件得出的結果有多條,也只會更新其中的一條文檔

# update_one,也是至少傳遞兩個參數,具體的參數能夠去看源碼,他只會將參數二的給的字段的值進行更新,不會像update那樣,整條數據都進行更新
# 仍是繼續上面那個例子:將age字段改成23
collection.update_one({"name":"zhuyu"},{"$set":{"age":23}})

# update_many,更新多條文檔


# 刪除文檔,參數至少一個,就是filter(篩選條件)
# delete_one() 刪除一條文檔
# delete_many()刪除多條文檔
相關文章
相關標籤/搜索