Ein paar Notizen zu Python und MongoDB 🙂 MongoDB ist eine NoSQL Datenbank, weitere Infos -> Wikipedia 🙂
Aktuelle MongoDB Version installieren (auf Ubuntu 16.04)
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2930ADAE8CAF5059EE73BB4B58712A2291FA4AD5 echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.6 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.6.list apt install apt-transport-https apt update apt-get install -y mongodb-org
siehe auch: https://docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu/
Python Erweiterung pymongo für MongoDB installieren mit pip
python -m pip install pymongo
siehe auch: https://api.mongodb.com/python/current/
Verbindung zur MongoDB
from pymongo import MongoClient client = MongoClient('localhost', 27017)
Connect zur Datenbank test
db = client.test
Collection myCollection in Datenbank test verbinden
coll = db.myCollection
Einen Datensatz anlegen in einer Collection
post = {"author":"Fritz Fuchs", "book":"Hasenjagd"} >>> coll.insert_one(post) <pymongo.results.InsertOneResult object at 0x7fd0136ce3f8>
Mehrere Datensätze in einer Collection anlegen
>>> posts = [{"author":"Fritz Fuchs", "book":"Hasenjagd 5"}, {"author":"Fritz Fuchs", "book":"Hasenjagd 6"}, {"author":"Fritz Fuchs", "book":"Hasenjagd 7"}] >>> result = coll.insert_many(posts) >>> result.inserted_ids [ObjectId('5b259b2c39d9c04f7b43af01'), ObjectId('5b259b2c39d9c04f7b43af02'), ObjectId('5b259b2c39d9c04f7b43af03')]
Datensatz suchen
>>> coll.find_one({"author":"Fritz Fuchs"}) {u'_id': ObjectId('5b25998139d9c04f7b43aefe'), u'book': u'Hasenjagd', u'author': u'Fritz Fuchs'}
Datensatz mit Regex suchen
>>> coll.find_one({"author":{"$regex": "^Fritz.*"}}) {u'_id': ObjectId('5b25998139d9c04f7b43aefe'), u'book': u'Hasenjagd', u'author': u'Fritz Fuchs'}
Datensatz mit ObjectId abrufen
>>> from bson.objectid import ObjectId >>> coll.find_one({"_id":ObjectId("5b25998139d9c04f7b43aefe")}) {u'_id': ObjectId('5b25998139d9c04f7b43aefe'), u'book': u'Hasenjagd', u'author': u'Fritz Fuchs'}
Mehrere Datensätze abrufen z.B. mit Regex
>>> for post in coll.find({"author":{"$regex": "^Fritz.*"}}): ... print post ... {u'_id': ObjectId('5b25998139d9c04f7b43aefe'), u'book': u'Hasenjagd', u'author': u'Fritz Fuchs'} {u'_id': ObjectId('5b259a8939d9c04f7b43aeff'), u'book': u'Hasenjagd 2', u'author': u'Fritz Fuchs'} {u'_id': ObjectId('5b259a9039d9c04f7b43af00'), u'book': u'Hasenjagd 3', u'author': u'Fritz Fuchs'}
Index erzeugen für Collection z.B. Username ist Unique
>>> import pymongo >>> db.users.create_index([('user_id', pymongo.ASCENDING)], unique=True) u'user_id_1'
>>> new_users = [{'user_id':'max'},{'user_id':'fritz'}] >>> db.users.insert_many(new_users) <pymongo.results.InsertManyResult object at 0x7fd0136cee18> >>> new_user = {'user_id':'max'} >>> db.users.insert_one(new_user) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/lib/python2.7/dist-packages/pymongo/collection.py", line 683, in insert_one session=session), File "/usr/local/lib/python2.7/dist-packages/pymongo/collection.py", line 599, in _insert bypass_doc_val, session) File "/usr/local/lib/python2.7/dist-packages/pymongo/collection.py", line 580, in _insert_one _check_write_command_response(result) File "/usr/local/lib/python2.7/dist-packages/pymongo/helpers.py", line 207, in _check_write_command_response _raise_last_write_error(write_errors) File "/usr/local/lib/python2.7/dist-packages/pymongo/helpers.py", line 188, in _raise_last_write_error raise DuplicateKeyError(error.get("errmsg"), 11000, error) pymongo.errors.DuplicateKeyError: E11000 duplicate key error collection: test.users index: user_id_1 dup key: { : "max" }
ObjectId als String
>>> new_user = {'user_id':'maxx'} >>> result = db.users.insert_one(new_user) >>> result <pymongo.results.InsertOneResult object at 0x7fd0122410e0> >>> result.inserted_id ObjectId('5b259ead39d9c04f7b43af07') >>> str(result.inserted_id) '5b259ead39d9c04f7b43af07'
String ObjectId zu ObjectId Object wandeln und für Suche verwenden
>>> from bson.objectid import ObjectId >>> str_obj = '5b259ead39d9c04f7b43af07' >>> users.find_one({'_id':ObjectId(str_obj)}) {u'_id': ObjectId('5b259ead39d9c04f7b43af07'), u'user_id': u'maxx'}
Datensatz löschen
>>> users.delete_one({'_id':ObjectId(str_obj)}) <pymongo.results.DeleteResult object at 0x7fd0136cee18>
Datensatz aktualisieren
>>> new_user = {'user_id':'maxx', 'name':'Hans Wurst'} >>> users.insert_one(new_user) >>> change = {'name': 'Fritz Fritz'} >>> users.update_one({'_id':ObjectId('5b25a14f39d9c04f7b43af08')}, {'$set':change} ) <pymongo.results.UpdateResult object at 0x7fd0136ced40> >>> users.find_one({'_id':ObjectId('5b25a14f39d9c04f7b43af08')}) {u'_id': ObjectId('5b25a14f39d9c04f7b43af08'), u'user_id': u'maxx', u'name': u'Fritz Fritz'}
Bereich bei Suche
>>> client = MongoClient() >>> db = client.huu >>> c = db.test >>> posts = [{"author":"Fritz Fuchs", "book":"Hasenjagd 5", "boo":1}, {"author":"Fritz Fuchs", "book":"Hasenjagd 6", "boo":5}, {"author":"Fritz Fuchs", "book":"Hasenjagd 7", "boo":10}] >>> c.insert_many(posts) >>> for post in c.find({"boo": {"$lt": 6}}).sort("author"): ... print post ... {u'author': u'Fritz Fuchs', u'_id': ObjectId('5b25bb9539d9c05186997b54'), u'book': u'Hasenjagd 5', u'boo': 1} {u'author': u'Fritz Fuchs', u'_id': ObjectId('5b25bb9539d9c05186997b55'), u'book': u'Hasenjagd 6', u'boo': 5} >>> for post in c.find({"boo": {"$gt": 6}}).sort("author"): ... print post ... {u'author': u'Fritz Fuchs', u'_id': ObjectId('5b25bb9539d9c05186997b56'), u'book': u'Hasenjagd 7', u'boo': 10} >>> for post in c.find({"boo": {"$lt": 6, "$gt": 3}}).sort("author"): ... print post ... {u'author': u'Fritz Fuchs', u'_id': ObjectId('5b25bb9539d9c05186997b55'), u'book': u'Hasenjagd 6', u'boo': 5}
Quelle / weitere Beispiele: http://api.mongodb.com/python/current/tutorial.html