Python mongoHelper模組

右介發表於2018-11-20
#!/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 import MongoClient, errors


class MongoOperator(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)
        except errors.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)
        except errors.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 else test.delete_one(filter)
            # waiting for test:
            print('>> MongoDB delete operation success.')
            print('>> Delete Information:', results.raw_result)
            print('>> Delete document count:', results.deleted_count)
        except errors.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 else test.find_one(filter)
            # waiting for test:
            print('>> MongoDB select operation success.', type(results))
        except errors.PyMongoError as e:
            print('>> MongoDB select operation fail:', type(e), e)
            results = None
            # add exception logging function later:
        finally:
            return results


    def 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 else test.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)
        except errors.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)

 

相關文章