成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python 和 MongoDB 其實很配

運維 數據庫運維 MongoDB
MongoDB 其實就是一個大大的 JSON,在 Python 的世界里 dict 也是最吃香的類型,所以,他們天生就是一對。

[[420498]]

 MongoDB 其實就是一個大大的 JSON,在 Python 的世界里 dict 也是最吃香的類型,所以,他們天生就是一對。

MongoDB 的安裝

推薦使用 Docker 來部署管理,一行命令就可以搞定,官方版本:

  1. docker run -d --name mongodb \ 
  2.     -e MONGO_INITDB_ROOT_USERNAME=admin \ 
  3.     -e MONGO_INITDB_ROOT_PASSWORD=admin \ 
  4.     -v ~/data/mongo_dir:/data/db \ 
  5.     -p 27017:27017 \ 
  6.     mongo 

官方版本的 Docker 啥都好,就是體積有點大。還有一個小體積的 alpine 版本,開發時使用很方便,不過不能配置賬戶和密碼。

  1. docker run -d --name mongo-lite \ 
  2.   -p 27018:27017 \ 
  3.   -v ~/data/mongo_lite:/data/db \ 
  4.   mvertes/alpine-mongo 

如果想嘗試 Mongo 的命令行 (Mongo Shell),直接進到 Docker 里:

  1. $ docker exec -it mongo-lite mongo 
  2. MongoDB shell version v4.0.6 
  3. connecting to: mongodb://127.0.0.1:27017/?gssapiServiceName=mongodb 
  4. ... 
  5.  
  6. > use mydb 
  7. switched to db mydb 
  8.  
  9. > db.User.insertOne({"name":"Toby",age:18}) 
  10.  "acknowledged" : true
  11.  "insertedId" : ObjectId("612c84c5d93795436ad27ebc"
  12.  
  13. > db.User.find() 
  14. "_id" : ObjectId("612c84c5d93795436ad27ebc"), "name" : "Toby""age" : 18 } 

Mongo Shell 官方文檔:https://docs.mongodb.com/manual/reference/mongo-shell/

PyMongo 五分鐘上手

安裝 PyMongo 可以通過 pip 搞定。

  1. pip install pymongo 

以下內容也可以參考官方文檔:https://pymongo.readthedocs.io/en/stable/

連接數據庫

常見方式如下:

  1. from pymongo import MongoClient 
  2.  
  3. # 連接有密碼的Mongo 
  4. client = MongoClient('mongodb://admin:admin@localhost:27017/'
  5.  
  6. # 連接沒密碼的Mongo 
  7. client = MongoClient('mongodb://localhost:27018/'
  8.  
  9. # 列出所有已經存在的DB 
  10. for db in client.list_databases(): 
  11.     print(db) 
  12.  
  13. # 使用Mongo里的某個DB,這個DB可以不存在,后面寫數據時會被創建出來 
  14. db = client.mydb 

插入數據

插入的每條數據都是一個 dict,一樣的字段允許類型不一樣,也允許每次插入的數據字段不一樣,可以理解成動態類型數據,你想放什么都行,唯一的約束就是他們會被放在同一個 Document 里。

  1. # 插入一條數據 
  2. def add_one_user(): 
  3.     db.User.insert_one({ 
  4.         'name''Toby'
  5.         'age': 18 
  6.     }) 
  7.  
  8. # 插入多條數據 
  9. def add_many_users(): 
  10.     db.User.insert_many([{ 
  11.         'name''Tom'
  12.         'age': 10 
  13.     }, { 
  14.         'name''Toby'
  15.         'age''unknown'
  16.         'hobbies': ['write bugs''raise dogs'
  17.     }]) 

這里的 User 約等于關系型數據庫的表,但它的名字叫 Document,每次數據插入完成后會返回一個_id,這是 Mongo 里最重要的東西了,它就是靠這個_id 來保證數據的一致性,后續的數據修改和刪除主要就是靠這個_id 來完成,所以一般針對某條特定的數據的處理,都是需要先查詢它的_id,然后再進行后面的操作。

查詢數據

  1. # 查詢多個數據 
  2. def show_users(): 
  3.     # 一個表里所有數據 
  4.     for e in db.User.find(): 
  5.         print(e) 
  6.  
  7.     # 匹配條件的多條數據 
  8.     for e in db.User.find({'name''Toby'}): 
  9.         print(e) 
  10.  
  11.  
  12. # 查詢單個數據 
  13. def query_user(name): 
  14.     return db.User.find_one({'name'name}) 
  15.  
  16.  
  17. # 忽略大小寫 
  18. def query_user_ignore_case(name): 
  19.     return db.User.find_one({'name': re.compile(name, re.IGNORECASE)}) 
  20.  
  21.  
  22. # 使用運算符 https://docs.mongodb.com/manual/reference/operator/query/ 
  23. def query_teenager(): 
  24.     return db.User.find_one({'age': {'$lt': 18}}) 

Mongo 的查詢主要還是依賴 DB 自己提供的運算符,在 PyMongo 里要注意,這里不會拋出異常,如果找不到數據,默認返回 None。

通過運算符查詢數據:https://docs.mongodb.com/manual/reference/operator/query/

通過聚合查詢數據:https://docs.mongodb.com/manual/aggregation/

修改數據

  1. # 修改一個數據 
  2. def update_user(user, attributes: dict): 
  3.     user.update(attributes) 
  4.     result = db.User.replace_one({'_id'user['_id']}, user, upsert=True
  5.     return {'affected_count': result.modified_count} 
  6.  
  7. u = query_user_ignore_case('toby'
  8. result = update_user(u, {'code''python'}) 
  9.  
  10. # 修改多個數據,注意有坑,Replace 和 Update是不一樣的 
  11. def update_many(): 
  12.     todo = [ 
  13.         UpdateOne({'age': 19}, {'$set': {'name''Toby'}}), 
  14.         ReplaceOne({'name''Tom'}, {'age': 19}),  # name 會被吃掉 
  15.     ] 
  16.     result = db.User.bulk_write(todo) 
    1. def delete_user(name): 
    2.     result = db.User.delete_one({'name'name}) 
    3.     return {'affected_count': result.deleted_count} 
  17.     print(result.matched_count) 

Replace 是替換,所以要帶上原有字段,這里有點坑。Update 不接受單獨的 dict,需要用 $set / $unset 來標識修改的字段的方式。

  1.    { $set: { status: "Modified", comments: [ "$misc1""$misc2" ] } }, 
  2.    { $unset: [ "misc1""misc2" ] } 

刪除數據

  1. def delete_user(name): 
  2.     result = db.User.delete_one({'name'name}) 
  3.     return {'affected_count': result.deleted_count} 

刪除多個數據:

  1. >>> db.test.count_documents({'x': 1}) 
  2. >>> result = db.test.delete_many({'x': 1}) 
  3. >>> result.deleted_count 
  4. >>> db.test.count_documents({'x': 1}) 

常見問題

有什么辦法可以讓 Mongo 不自動添加 _id 到我的數據里?

幾乎沒有,這是 MongoDB 的特性決定的,如果你的數據沒有 ID 的話,并且進行高并發插入時,大概率會遇到 BulkWriteError 這個錯誤。

  1. >>> doc = {} 
  2. >>> collection.insert_many(doc for _ in range(10)) 
  3. Traceback (most recent call last): 
  4. ... 
  5. pymongo.errors.BulkWriteError: batch op errors occurred 
  6. >>> doc 
  7. {'_id': ObjectId('560f171cfba52279f0b0da0c')} 
  8.  
  9. >>> docs = [{}] 
  10. >>> collection.insert_many(docs * 10) 
  11. Traceback (most recent call last): 
  12. ... 
  13. pymongo.errors.BulkWriteError: batch op errors occurred 
  14. >>> docs 
  15. [{'_id': ObjectId('560f1933fba52279f0b0da0e')}] 

如果你不想要自動生成的 ID,可以自己在插入數據前指定這個字段。

為啥我指定了_id 還是查詢不到我的數據?

比如我要查詢數據庫里的某個 post:

  1. >>> post_id_as_str = str(post_id) 
  2. >>> posts.find_one({"_id": post_id_as_str}) # No result 

因為 pyMongo 里的這個 ID 不是字符串類型,你需要做一下數據轉換。

  1. from bson.objectid import ObjectId 
  2.  
  3. # The web framework gets post_id from the URL and passes it as a string 
  4. def get(post_id): 
  5.     # Convert from string to ObjectId: 
  6.     document = client.db.collection.find_one({'_id': ObjectId(post_id)}) 

用標準庫里的 json 模塊來序列化和反序列化 Mongo 的數據會有什么問題?

有一些數據類型在反序列后會得不到預期的結果,比如 ObjectId 和 DBRef,PyMongo 為了解決這個問題自己封裝了一個輔助類 json_util,可以很好的解決這些問題。

  1. from bson.json_util import loads 
  2. from bson.json_util import dumps 

總結

Mongo 屬于非關系型數據庫,使用 Mongo 作為 DB 的思維需要做比較大的轉變:

  1. 關系型數據庫一般讀寫容易,修改難,容易理解
  2. 非關系型數據庫一般是讀寫改容易,設計難(相對而言)

“關系型數據庫支持 ACID (Atomicity, Consistency, Isolation, Duration) 即原子性,一致性,隔離性和持續性。相對而言,NoSQL 采用更寬松的模型 BASE (Basically Available, Soft state, Eventual Consistency) 即基本可用,軟狀態和最終一致性。

NoSQL 在精心的設計下查詢性能會更高,數據結構也十分有彈性,特別適合快速發展和屬性不確定的產品功能,但 Mongo 不支持事務,如何確保數據一致性是個挺大的挑戰。

在選擇上可以考慮從以下角度去思考:

  1. 需要 ACID 還是 BASE
  2. 需要結構化數據還是非結構化數據
  3. 需要對數據進行靈活擴展
  4. 開發人員的經驗

很多情況只考慮最后一點就可以了。

 

責任編輯:武曉燕 來源: 哎媽呀Bug
相關推薦

2010-04-12 11:02:28

Oracle性能

2012-10-17 09:39:44

編程語言PHP學習學習編程

2020-12-14 14:19:21

數據科學機器學習

2010-03-24 16:49:26

Python安裝

2018-08-22 11:55:02

Python網絡爬蟲正則表達式

2012-11-08 00:46:00

AMD服務器芯片

2016-09-09 09:09:39

2021-11-03 23:17:22

iPhone手機延遲

2015-08-12 14:07:20

創業成功心態

2021-11-19 14:29:06

密碼雙因子驗證網絡安全

2017-07-12 15:49:32

ASGit開發

2010-02-23 16:21:24

Python Win

2015-12-07 15:02:28

NessusPowershell系統安全

2017-02-27 11:20:31

大數據DevOps遷移

2019-07-17 08:41:42

Java補碼反碼

2022-08-01 15:06:56

圖論

2019-03-08 11:21:45

Windows 功能系統

2017-12-28 15:20:50

2012-02-01 09:04:08

諾基亞WPNFC

2011-09-13 08:55:59

在這兒IM在這兒職業
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 美女国内精品自产拍在线播放 | 久久av一区二区三区 | 欧美久久不卡 | 国产成人精品久久二区二区91 | 久久av网 | 日日做夜夜爽毛片麻豆 | 欧美精三区欧美精三区 | av网站在线播放 | 成人超碰在线 | 国产第1页 | 九九热在线免费视频 | 久久一及片 | 一区二区三区精品视频 | 久久综合狠狠综合久久综合88 | 女女百合av大片一区二区三区九县 | 国产精品一区二区免费 | 91中文在线观看 | 精品国产乱码久久久久久老虎 | 亚洲情综合五月天 | 国产日产久久高清欧美一区 | 国产精品成人一区二区三区夜夜夜 | 一区福利视频 | 午夜精品久久久久久久星辰影院 | 五月香婷婷 | 在线观看国产 | 在线观看国产wwwa级羞羞视频 | 欧美一区免费 | 国产一区不卡 | 欧美精品一区免费 | 亚洲欧美日韩在线一区二区 | 中文字幕亚洲视频 | 国产 日韩 欧美 制服 另类 | 日韩美女在线看免费观看 | 人人草人人干 | 成人在线免费av | 午夜影视网 | 国产成人精品一区二 | 国产精品久久777777 | av在线播放国产 | 在线观看视频91 | 国产日韩欧美一区二区 |