mongo-manager-juan-palma-borda


Namemongo-manager-juan-palma-borda JSON
Version 0.9.7 PyPI version JSON
download
home_pagehttps://github.com/muerterauda/mongo_manager
SummaryLibreria para manejar objetos almacenados en MongoDB, usando la referencia de los CRUDRepository de SpringBoot
upload_time2023-12-15 10:33:46
maintainer
docs_urlNone
authorJuan Palma Borda
requires_python>=3.7
license
keywords mongodb pymongo mongo_manager
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Mongo Manager (0.9.7)

Libreria para el manejo de Objetos almacenados en base de datos MongoDB.

Testeado el funcionamiento basico en Python 3.7, 3.8, 3.9, 3.10, 3.11 y 3.12 y para las versiones de Mongo 4.2, 4.4, 5.0 y 6.0.

## Clases

### MongoManager

Crea la conexion con la base de datos, se debe inicilizar antes de 
invocar ningun repositorio de objetos.

### ObjetoMongoAbstract

Clase abstracta en la que se representa un objeto mongo predefinido,
su constructor recibe un object _id haciendo referencia al '_id' del
objeto Mongo y **kwargs con los argumentos desechados por el
constructor concreto de tu clase. Es recomendable llamar al contructor 
padre para establecer los atributos.

### Objetos internos

En caso de tener objetos interno dentro del objeto principal es necesario
reescribir las funciones internas get_dict y generar_object_from_dict de 
forma que el objeto se transforme y destransforme en un diccionario.

En caso de que el objeto o la lista de objetos internos hereden de la clase ObjetoMongoAbstract
se puede modificar el metodo get_attr_nested_objects de la siguiente manera
*{nombre_atributo: clase_atributo(aunque sea una lista)}* y automaticamente se instanciaran y desinstanciaran
solos.

### RepositoryBase

Repositorio base de mongo, recibe como parametros en el constructor,
la coleccion a la que se hace referencia y el objeto al que va a convertir
los resultados de las query que se realicen.

En caso de querer usar una coleccion no perteneciente a la base de datos instanciada,
se puede pasar el atributo *connection_collection* que debe ser una instancia de la conexion 
*MongoClient* para la coleccion a tratar por el repositorio.

## Ejemplo 1

En este ejemplo veremos el uso de la libreria definiendo un objeto <i>Book</i> 
que hereda de ObjetoMongoAbstract y para el que implementa un <i>RepositoryBook</i>
 para poder manejar el objeto de manera más comoda.

    class Book(ObjetoMongoAbstract):
            def __init__(self, name, id_mongo=None, **kwargs):
                super().__init__(id_mongo, **kwargs)
                self.name = name
        
            def __str__(self) -> str:
                return "{}".format(self.name)

    class BookOverrided(ObjetoMongoAbstract):
            def __init__(self, name, id_mongo=None, **kwargs):
                super().__init__(id_mongo, **kwargs)
                self.name = name

            def get_dict(self, id_mongo=True, id_as_string=False) -> dict:
                d = super().get_dict(id_mongo, id_as_string)
                d.pop('name')
                d['nombre'] = self.name
                return d
        
            @classmethod
            def generar_object_from_dict(cls, dictionary):
                if dictionary is None:
                    return None
                return cls(name=dictionary.get('nombre'))


            def __str__(self) -> str:
                return "{}".format(self.name)

    class RepositoryBook(RepositoryBase[Book]):
        def __init__(self, conection_collection=None) -> None:
            super().__init__('book', Book, conection_collection)

    class RepositoryBookOverrided(RepositoryBase[BookOverrided]):
        def __init__(self, conection_collection=None) -> None:
            super().__init__('book', BookOverrided, conection_collection)

    def main():
        a = RepositoryBook()
        b = Book('test')
        c = RepositoryBookOverrided()
        d = BookOverrided('test')
        a.insert_one(b)
        c.insert_one(d)
        print(a.find_all()[-1])
        print(c.find_all()[-1])


    if __name__ == '__main__':
        MongoManager('user', 'psw', 'bd', 'authenticationDatabase')
        main()


### Aggregates

Los Aggregates se han dispuesto para poder ser creados de dos maneras distintas.

 - Usando los decoradores definidos en el fichero _aggregation_decorator.py_ en combinacion
con las clases _AggregationStage_ y _AggregationOperation_ cuyos hijos implementan los distintas 
funciones permitidas en MongoDB, asi como los parametros que reciben.

   El decorador permite a la función definida dentro de una clase que herede de _RepositoryBase_, recibir un
AggregationExecutor que se ejecutar una vez finalizada la función, para ello todas las funciones usen estos decoradores
deberán devolver dicho parametro.

   Un ejemplo se puede ver a continuación, en el que se realiza un match a todos los libros que tengan en su nombre una *s* mayuscula 
o minuscula, agrupa el resultado por nombre y cuenta los integrantes de cada grupo y finalmente genera el resultado con
el formato {name: book_name_group, counter: total_books}:

       class RepositoryBook(RepositoryBase[Book]):
           def __init__(self, conection_collection=None) -> None:
               super().__init__('book', Book, conection_collection)
       
           @agg_de.aggregation_decorator
           def test_aggregation(self, agg: AggregationExecutor):
               a = agg_st.AggStMatch()
               a['nombre'] = agg_op_re.AggOpRegex('test',
                                                  agg_op_re.AggOpRegex.get_options_regex(insensitive=True))
               b = agg_st.AggStGroup(id_mapping={'name': '$name'})
               b['counter'] = {'$sum': 1}
               c = agg_st.AggStProject({'name': '$_id.name', 'counter': 1})
               agg.add_steps(a, b, c)
               return agg

 - Usando los antigüos metodos definidos en el _mongo_utils.py_ que sirven de ayuda para poder generar los aggregates.

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/muerterauda/mongo_manager",
    "name": "mongo-manager-juan-palma-borda",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">=3.7",
    "maintainer_email": "",
    "keywords": "mongodb,pymongo,mongo_manager",
    "author": "Juan Palma Borda",
    "author_email": "Juan Palma Borda <juanpalmaborda@hotmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/59/a0/02239d530a7048dc3867256cdbe082e5f8cb911425081cfe150eb0a9ef37/mongo_manager_juan_palma_borda-0.9.7.tar.gz",
    "platform": null,
    "description": "# Mongo Manager (0.9.7)\n\nLibreria para el manejo de Objetos almacenados en base de datos MongoDB.\n\nTesteado el funcionamiento basico en Python 3.7, 3.8, 3.9, 3.10, 3.11 y 3.12 y para las versiones de Mongo 4.2, 4.4, 5.0 y 6.0.\n\n## Clases\n\n### MongoManager\n\nCrea la conexion con la base de datos, se debe inicilizar antes de \ninvocar ningun repositorio de objetos.\n\n### ObjetoMongoAbstract\n\nClase abstracta en la que se representa un objeto mongo predefinido,\nsu constructor recibe un object _id haciendo referencia al '_id' del\nobjeto Mongo y **kwargs con los argumentos desechados por el\nconstructor concreto de tu clase. Es recomendable llamar al contructor \npadre para establecer los atributos.\n\n### Objetos internos\n\nEn caso de tener objetos interno dentro del objeto principal es necesario\nreescribir las funciones internas get_dict y generar_object_from_dict de \nforma que el objeto se transforme y destransforme en un diccionario.\n\nEn caso de que el objeto o la lista de objetos internos hereden de la clase ObjetoMongoAbstract\nse puede modificar el metodo get_attr_nested_objects de la siguiente manera\n*{nombre_atributo: clase_atributo(aunque sea una lista)}* y automaticamente se instanciaran y desinstanciaran\nsolos.\n\n### RepositoryBase\n\nRepositorio base de mongo, recibe como parametros en el constructor,\nla coleccion a la que se hace referencia y el objeto al que va a convertir\nlos resultados de las query que se realicen.\n\nEn caso de querer usar una coleccion no perteneciente a la base de datos instanciada,\nse puede pasar el atributo *connection_collection* que debe ser una instancia de la conexion \n*MongoClient* para la coleccion a tratar por el repositorio.\n\n## Ejemplo 1\n\nEn este ejemplo veremos el uso de la libreria definiendo un objeto <i>Book</i> \nque hereda de ObjetoMongoAbstract y para el que implementa un <i>RepositoryBook</i>\n para poder manejar el objeto de manera m\u00e1s comoda.\n\n    class Book(ObjetoMongoAbstract):\n            def __init__(self, name, id_mongo=None, **kwargs):\n                super().__init__(id_mongo, **kwargs)\n                self.name = name\n        \n            def __str__(self) -> str:\n                return \"{}\".format(self.name)\n\n    class BookOverrided(ObjetoMongoAbstract):\n            def __init__(self, name, id_mongo=None, **kwargs):\n                super().__init__(id_mongo, **kwargs)\n                self.name = name\n\n            def get_dict(self, id_mongo=True, id_as_string=False) -> dict:\n                d = super().get_dict(id_mongo, id_as_string)\n                d.pop('name')\n                d['nombre'] = self.name\n                return d\n        \n            @classmethod\n            def generar_object_from_dict(cls, dictionary):\n                if dictionary is None:\n                    return None\n                return cls(name=dictionary.get('nombre'))\n\n\n            def __str__(self) -> str:\n                return \"{}\".format(self.name)\n\n    class RepositoryBook(RepositoryBase[Book]):\n        def __init__(self, conection_collection=None) -> None:\n            super().__init__('book', Book, conection_collection)\n\n    class RepositoryBookOverrided(RepositoryBase[BookOverrided]):\n        def __init__(self, conection_collection=None) -> None:\n            super().__init__('book', BookOverrided, conection_collection)\n\n    def main():\n        a = RepositoryBook()\n        b = Book('test')\n        c = RepositoryBookOverrided()\n        d = BookOverrided('test')\n        a.insert_one(b)\n        c.insert_one(d)\n        print(a.find_all()[-1])\n        print(c.find_all()[-1])\n\n\n    if __name__ == '__main__':\n        MongoManager('user', 'psw', 'bd', 'authenticationDatabase')\n        main()\n\n\n### Aggregates\n\nLos Aggregates se han dispuesto para poder ser creados de dos maneras distintas.\n\n - Usando los decoradores definidos en el fichero _aggregation_decorator.py_ en combinacion\ncon las clases _AggregationStage_ y _AggregationOperation_ cuyos hijos implementan los distintas \nfunciones permitidas en MongoDB, asi como los parametros que reciben.\n\n   El decorador permite a la funci\u00f3n definida dentro de una clase que herede de _RepositoryBase_, recibir un\nAggregationExecutor que se ejecutar una vez finalizada la funci\u00f3n, para ello todas las funciones usen estos decoradores\ndeber\u00e1n devolver dicho parametro.\n\n   Un ejemplo se puede ver a continuaci\u00f3n, en el que se realiza un match a todos los libros que tengan en su nombre una *s* mayuscula \no minuscula, agrupa el resultado por nombre y cuenta los integrantes de cada grupo y finalmente genera el resultado con\nel formato {name: book_name_group, counter: total_books}:\n\n       class RepositoryBook(RepositoryBase[Book]):\n           def __init__(self, conection_collection=None) -> None:\n               super().__init__('book', Book, conection_collection)\n       \n           @agg_de.aggregation_decorator\n           def test_aggregation(self, agg: AggregationExecutor):\n               a = agg_st.AggStMatch()\n               a['nombre'] = agg_op_re.AggOpRegex('test',\n                                                  agg_op_re.AggOpRegex.get_options_regex(insensitive=True))\n               b = agg_st.AggStGroup(id_mapping={'name': '$name'})\n               b['counter'] = {'$sum': 1}\n               c = agg_st.AggStProject({'name': '$_id.name', 'counter': 1})\n               agg.add_steps(a, b, c)\n               return agg\n\n - Usando los antig\u00fcos metodos definidos en el _mongo_utils.py_ que sirven de ayuda para poder generar los aggregates.\n",
    "bugtrack_url": null,
    "license": "",
    "summary": "Libreria para manejar objetos almacenados en MongoDB, usando la referencia de los CRUDRepository de SpringBoot",
    "version": "0.9.7",
    "project_urls": {
        "Homepage": "https://github.com/muerterauda/mongo_manager"
    },
    "split_keywords": [
        "mongodb",
        "pymongo",
        "mongo_manager"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "58c651d7a189236a2661dc62aaa871681f150f113493a162204008635948ebe4",
                "md5": "3a2e6a796a1725f65d54bfd4d127233d",
                "sha256": "ebb7db0e2775167c64bc05aabecc353cd9e84084c3f7ebd3c296d8b4f9493511"
            },
            "downloads": -1,
            "filename": "mongo_manager_juan_palma_borda-0.9.7-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "3a2e6a796a1725f65d54bfd4d127233d",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.7",
            "size": 18481,
            "upload_time": "2023-12-15T10:33:44",
            "upload_time_iso_8601": "2023-12-15T10:33:44.877880Z",
            "url": "https://files.pythonhosted.org/packages/58/c6/51d7a189236a2661dc62aaa871681f150f113493a162204008635948ebe4/mongo_manager_juan_palma_borda-0.9.7-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "59a002239d530a7048dc3867256cdbe082e5f8cb911425081cfe150eb0a9ef37",
                "md5": "5adbf9aaa397581fbfbd71a467075bf8",
                "sha256": "cdfe1ec96ba2c5988d61e2f9c87a07147773a2f3fa948e2ee9adb172d10b348c"
            },
            "downloads": -1,
            "filename": "mongo_manager_juan_palma_borda-0.9.7.tar.gz",
            "has_sig": false,
            "md5_digest": "5adbf9aaa397581fbfbd71a467075bf8",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.7",
            "size": 14797,
            "upload_time": "2023-12-15T10:33:46",
            "upload_time_iso_8601": "2023-12-15T10:33:46.433179Z",
            "url": "https://files.pythonhosted.org/packages/59/a0/02239d530a7048dc3867256cdbe082e5f8cb911425081cfe150eb0a9ef37/mongo_manager_juan_palma_borda-0.9.7.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2023-12-15 10:33:46",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "muerterauda",
    "github_project": "mongo_manager",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "requirements": [],
    "lcname": "mongo-manager-juan-palma-borda"
}
        
Elapsed time: 0.15026s