#!/usr/bin/env python3#-*- coding: utf-8 -*-
'''Defines a MongoOperator class and allows you to manipulate
the Mongodb Database.(insert, delete, update, select...)'''
from pymongo importMongoClient, errorsclassMongoOperator(object):'''MongoOperator class allows you to manipulate the Mongodb
Database.
:Usage:'''
def __init__(self, **login):'''The constructor of Mongodb class.
Creates an instance of MongoOperator and starts connecting
to the Mongodb server's test database.
:Args:
- **login - Keyword arguments used in MongoClient() and
Database.authenticate() functions in order to connect to
test database and authenticate clients (including host,
user, password...)'''
#connectin to test database:
self.__db = MongoClient(login['host'], login['port'])[login['database']]
self.__db.authenticate(login['user'], login['password'])def insertOne(self, document, *, collection='test'):'''Insert one document into collection named test in Mongodb
database.
:Args:
- document - dict. One document to execute insertion.
- colletion - str. Named keyword argument used to specify
which collection to insert.'''
#select a collection to execute insert operation:
test = self.__db[collection]#insert transaction begin:
try:
result=test.insert_one(document)print('>> MongoDB insertOne operation success.')print('>> Inserted ID:',result.inserted_id)excepterrors.PyMongoError as e:print('>> MongoDB insertOne operation fail:', type(e), e.details)#add exception logging function later:
def insertMany(self, *documents, collection='test'):'''Insert many document into collection named test in Mongodb
database.
:Args:
- *documents - list of document in variable arguments. Many
documents(require more than one) to execute insertion.
- colletion - str. Named keyword argument used to specify
which collection to insert.'''
#params check:
if len(documents) <=0:raise ValueError("Documents can't be empty.")elif len(documents) <= 1:raise TypeError("MongoDB insertMany Operation need more then one record.")#select a collection to execute insert operation:
test = self.__db[collection]#insert transaction begin:
try:
results=test.insert_many(documents)print('>> MongoDB insertMany operation success.')print('>> Inserted IDs:', results.inserted_ids)excepterrors.PyMongoError as e:print('>> MongoDB insertMany operation fail:', type(e), e.details)#add exception logging function later:
def delete(self, filter, *, collection='test', many=False):'''Delete a single or many documents matching the filter
from collection test in Mongodb database.
:Args:
- filter - A query that matches the document to delete.
- many - bool. Named keyword argument. If True, execute
delete_many(); If not, then execute delete_one().
- colletion - str. Named keyword argument used to specify
which collection to delete.'''
#select a collection to execute delete operation:
test = self.__db[collection]#delete transaction begin:
try:
results= test.delete_many(filter) if many elsetest.delete_one(filter)#waiting for test:
print('>> MongoDB delete operation success.')print('>> Delete Information:', results.raw_result)print('>> Delete document count:', results.deleted_count)excepterrors.PyMongoError as e:print('>> MongoDB delete operation fail:', type(e), e)#add exception logging function later:
def select(self, filter=None, *, collection='test', many=False):'''Select a single or many documents matching the filter
from collection test in Mongodb database.
:Args:
- filter - A query that matches the document to select.
- many - bool. Named keyword argument. If True, execute
find(); If not, then execute find_one().
- colletion - str. Named keyword argument used to specify
which collection to select.
:Returns:
- results - If select success, returns a Cursor instance for
navigating select results. If not, returns None.'''
#selcet a collection to execute select operation:
test = self.__db[collection]#select transaction begin:
try:
results= test.find(filter, no_cursor_timeout=True) if many elsetest.find_one(filter)#waiting for test:
print('>> MongoDB select operation success.', type(results))excepterrors.PyMongoError as e:print('>> MongoDB select operation fail:', type(e), e)
results=None#add exception logging function later:
finally:returnresultsdef update(self, filter, update, *, collection='test', many=False):'''Update a single or many documents matching the filter
from collection test in Mongodb database.
:Args:
- filter - A query that matches the document to update.
- update - The modifications to apply.
- many - bool. Named keyword argument. If True, execute
update_many(); If not, then execute update_one().
- colletion - str. Named keyword argument used to specify
which collection to update.'''
#select a collection to execute update operation:
test = self.__db[collection]#update transaction begin:
try:
results= test.update_many(filter, update) if many elsetest.update_one(filter, update)#waiting for test:
print('>> MongoDB update operation success:', type(results), results)print('>> Update Information:', results.raw_result)print('>> Matching Counts:', results.matched_count)print('>> Modified Counts:', results.modified_count)excepterrors.PyMongoError as e:print('>> MongoDB update operation fail:', type(e), e)#add exception logging function later:
#test:
if __name__ == '__main__':
logIn= {'host': 'localhost', 'port': 27017, 'database': 'test','user': '', 'password': ''}
documents= [{'id': 1, 'name': 'zty'}, {'id': 2, 'name': 'zzz'}, {'id': 3, 'name': 'ttt'}]
document= {'id': 1, 'name': 'zty'}
mongoHandler= MongoOperator(**logIn)for document in mongoHandler.select({'name': 'zty'}, many=True):print(document)
mongoHandler.insertOne(document)print(mongoHandler.select({'name': 'zty'}))
mongoHandler.insertMany(*documents)for document in mongoHandler.select({'name': 'zty'}, many=True):print(document)
mongoHandler.update({'name': 'zty'}, {'$set': {'name': 'yyy'}}, many=True)for document in mongoHandler.select({'name': 'zzz'}, many=True):print(document)
mongoHandler.delete({'name': 'zzz'}, many=True)for document in mongoHandler.select({'name': 'zzz'}, many=True):print(document)