# 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"
}