ããã¯ããªã«ãããããŠæžãããã®ïŒ
MongoDBã®ç·Žç¿ããŠãã«ãPythonããMongoDBã«ã¢ã¯ã»ã¹ããããã°ã©ã ãæžããŠã¿ããããªãšã
MongoDBã®Pythonãã©ã€ããŒ
MongoDBã®Pythonãã©ã€ããŒã¯ãMongoDBã®ãµã€ããèŠããšPyMongoãšMotorãããããã§ãã
MongoDB Python Drivers — MongoDB Ecosystem
Motor (Async Driver) — MongoDB Ecosystem
PyMongoãæšå¥šã®ãã©ã€ããŒã§ãMotorã¯Tornadeãasyncioãšäºææ§ã®ããéåæãã©ã€ããŒã®ããã§ãã
MongoDBæ¬äœã®ããŒãžã§ã³ãšã®äºææ§ã確èªããŠã¿ããšãMotorã¯éäžã§æ¢ãŸã£ãŠããããã«ãæããŸãã
MotorïŒAsync DriverïŒ / Compatibility
ãã®æå³ã§ããPyMongoãéžæããããããã§ããã
PyMongoã®ãããã¥ã¡ã³ãããã³APIãªãã¡ã¬ã³ã¹ã¯ãã¡ãã§ãã
PyMongo 3.9.0 Documentation — PyMongo 3.9.0 documentation
API Documentation — PyMongo 3.9.0 documentation
ã§ã¯ã䜿ã£ãŠãã£ãŠã¿ãŸãããã
ç°å¢
ä»åã®ç°å¢ã¯ããã¡ãã§ãã
$ python3 -V Python 3.6.9 $ pip3 -V pip 9.0.1 from /path/to/venv/lib/python3.6/site-packages (python 3.6)
ãŸããMongoDBã®ããŒãžã§ã³ã¯4.2.3ãšããMongoDBãåäœããŠãããµãŒããŒã®IPã¢ãã¬ã¹ã¯172.17.0.2ãšããŸãã
ã€ã³ã¹ããŒã«
ããã¥ã¡ã³ãã«æ²¿ã£ãŠãPyMongoãã€ã³ã¹ããŒã«ããŸãã
Installing / Upgrading — PyMongo 3.9.0 documentation
Python 2.7ã3.4以äžã«å¯Ÿå¿ããŠããããã§ããã
PyMongo supports CPython 2.7, 3.4+, PyPy, and PyPy3.5+
pipã§ã€ã³ã¹ããŒã«ã
$ pip3 install pymongo
ä»åã¯ã3.10.1ãã€ã³ã¹ããŒã«ãããŸããã
$ pip3 freeze | grep pymongo pymongo==3.10.1
ãããã®æç¹ã®ããã¥ã¡ã³ãã®ãcurrentãã¯ã3.9.0ãªãã§ããããããã¯ãã©ãããããšã§ãããããŸããä»åã¯æ°ã«ãããããŸããâŠã
ãã®ãšã³ããªãåç
§ããŠããããã¥ã¡ã³ããžã®ãªã³ã¯ã¯ã3.9.0ã§åºå®ããŠãããŸãã
ããšã確èªã¯ãã¹ãã³ãŒãã§è¡ãããšæãã®ã§ãpytestãã€ã³ã¹ããŒã«ããŠãããŸãã
$ pip3 install pytest $ pip3 freeze | grep pytest pytest==5.4.1
ãã£ã¬ã¯ããªãš__init__.pyãäœæããŠãæºåå®äºã
$ mkdir tests && touch tests/__init__.py
ãã¹ãã³ãŒãã®é圢
ãã¹ãã³ãŒãã®é圢ã¯ããã¡ãã
tests/test_pymongo.py
import re from pymongo import MongoClient import pymongo # ããã«ããã¹ããæžãïŒ
åºæ¬çã«ã¯ãPyMongoã®ãã¥ãŒããªã¢ã«ãèŠã€ã€ãå¿ èŠã«å¿ããŠAPIãªãã¡ã¬ã³ã¹ãåç §ããŠé²ããŠããã®ããªããšæããŸãã
Tutorial — PyMongo 3.9.0 documentation
API Documentation — PyMongo 3.9.0 documentation
PyMongoããMongoDBã«æ¥ç¶ãã
PyMongoããMongoDBã«æ¥ç¶ããæ¹æ³ã¯ããã¡ãã
Making a Connection with MongoClient
æ¥ç¶å
ãšãªããµãŒããŒã®èšèŒæ¹æ³ã¯ã2éãããããã§ããããŸããMongoClientã¯ã³ã³ããã¹ããããŒãžã£ãŒãããã³ã«ãå®è£
ããŠ
ããã®ã§ãwithæ§æã䜿ããŸãã
ãããªæãã§ããã
def test_connect_mongo(): client = MongoClient("172.17.0.2", 27017) assert client is not None client.close() def test_connect_mongo_with(): with MongoClient("mongodb://172.17.0.2:27017") as client: assert client is not None
䜿ããªããªã£ãæ¥ç¶ã¯ãcloseããŠãããŸãããã
ã¡ãªã¿ã«ãMongoClientã¯ã³ãã¯ã·ã§ã³ããŒã«ã®åœ¹å²ãæã£ãŠããŸãã
How does connection pooling work in PyMongo?
ã¹ã¬ããã»ãŒãã§ãããããã»ã¹ã»ãŒãã§ã¯ãããŸããããšã
ç¶ããŠãããŒã¿ããŒã¹ãšã³ã¬ã¯ã·ã§ã³ã®ååŸã
ä»åã¯æžç±ããé¡ã«ãããŒã¿ããŒã¹ãšã³ã¬ã¯ã·ã§ã³ãäœæã
def test_get_database_and_collection(): with MongoClient("172.17.0.2", 27017) as client: test_db = client.test_db book_collection = test_db.book_collection assert book_collection is not None
ããã¥ã¡ã³ã1件ã®ç»é²ã1件ã®ååŸ
ã§ã¯ãããã¥ã¡ã³ããç»é²ããŠã¿ãŸãã
ãŸãã¯1件ç»é²ããŠã1件ååŸã
Getting a Single Document With find_one()
ãããªæãã§ãã³ã¬ã¯ã·ã§ã³ã«å¯ŸããŠinsert_oneã§ããã¥ã¡ã³ãã1件ç»é²ãfind_oneã§æå®ã®ããã¥ã¡ã³ãã1件ååŸã§ããŸãã
def test_document_insert_and_find_one(): with MongoClient("172.17.0.2", 27017) as client: test_db = client.test_db book_collection = test_db.book_collection book = {"isbn": "978-4873117386", "title": "å ¥é Python 3", "price": 4070} book_collection.insert_one(book) assert book_collection.find_one({"isbn": "978-4873117386"})["title"] == book["title"] assert book_collection.count_documents({}) == 1 book_collection.delete_many({}) assert book_collection.count_documents({}) == 0
ãã¹ãã³ãŒãã®éœåäžãã«ãŠã³ããšå šä»¶ååŸãè¡ã£ãŠããŸããã
è€æ°ä»¶ã®ããã¥ã¡ã³ãã®ç»é²ãååŸ
ç¶ããŠãè€æ°ããã¥ã¡ã³ãã®ç»é²ãšãè€æ°ããã¥ã¡ã³ãã®æ€çŽ¢ãè¡ã£ãŠã¿ãŸãããã
Querying for More Than One Document
ãããªæãã§ã
def test_document_insert_and_find_many(): with MongoClient("172.17.0.2", 27017) as client: test_db = client.test_db book_collection = test_db.book_collection books = [ {"isbn": "978-4873117386", "title": "å ¥é Python 3", "price": 4070}, {"isbn": "978-4048930611", "title": "ãšãã¹ããŒãPythonããã°ã©ãã³ã°æ¹èš2ç", "price": 3960}, {"isbn": "978-4297111113", "title": "Pythonå®è·µå ¥é", "price": 3278} ] book_collection.insert_many(books) assert book_collection.count_documents({}) == 3 found_all_books = [book for book in book_collection.find({}, sort = [("price", pymongo.DESCENDING)])] assert found_all_books[0]["title"] == "å ¥é Python 3" assert len(found_all_books) == 3 found_books = [book for book in book_collection.find({"title": re.compile("Python"), "price": {"$gt": 3500}}, sort = [("price", pymongo.ASCENDING)])] assert found_books[0]["title"] == "ãšãã¹ããŒãPythonããã°ã©ãã³ã°æ¹èš2ç" assert len(found_books) == 2 book_collection.delete_many({}) assert book_collection.count_documents({}) == 0
ããã¥ã¡ã³ããè€æ°ä»¶ç»é²ããã«ã¯ãã³ã¬ã¯ã·ã§ã³ã«å¯ŸããŠinsert_manyãåŒã³åºãã°OKã§ããåŒæ°ã¯ãç»é²ãããããã¥ã¡ã³ãã®
ãªã¹ãã§ãã
æ€çŽ¢ã¯findã§è¡ãã®ã§ãããæ»ãå€ã¯Cursorã«ãªãã®ã§ä»åã¯å å è¡šèšã§ãªã¹ãã«å€æããŠããŸãã
found_all_books = [book for book in book_collection.find({}, sort = [("price", pymongo.DESCENDING)])]
ããšãäŸ¡æ Œã®éé ãœãŒãã«ããŠãããŸããã
ãŸããããã²ãšã€æ€çŽ¢ã®ãã¿ãŒã³ãšããŠã¯ãANDæ¡ä»¶ã§æ£èŠè¡šçŸãæ¯èŒæŒç®åã䜿ããã®ãã
found_books = [book for book in book_collection.find({"title": re.compile("Python"), "price": {"$gt": 3500}}, sort = [("price", pymongo.ASCENDING)])]
æ£èŠè¡šçŸã§æ€çŽ¢ãè¡ãå Žåã¯ãPythonã®æ£èŠè¡šçŸãªããžã§ã¯ããæž¡ãã°OKã§ãããã¡ãã®ãœãŒãã¯ãäŸ¡æ Œã®æé ã«ããŠãããŸããã
ãšããããããããªãšããã§ããããã
ãŸãšã
MongoDBã®Pythonãã©ã€ããŒãPyMongoããMongoDBã«ã¢ã¯ã»ã¹ããŠãåæ©çãªæäœããã£ãšè©ŠããŠã¿ãŸããã
ãã£ã¯ã·ã§ããªãŒãããŒã¹ã«ããŠäœ¿ããã®ã§ãç°¡åã«äœ¿ããŠããã®ã§ã¯ãªãã§ããããã
ã¡ãã£ãšããæã«å©çšããŠãããã ãããªãŒãšæããŸãã