Esta guía muestra ejemplos de cómo utilizar esquemas PyMongoArrow en situaciones comunes.
Datos anidados con esquema
Al realizar operaciones de agregación o búsqueda, puede proporcionar un esquema para datos anidados mediante el uso de struct objeto. Puede haber nombres conflictivos en los subdocumentos en comparación con sus documentos principales.
from pymongo import MongoClient from pymongoarrow.api import Schema, find_arrow_all from pyarrow import struct, field, int32 coll = MongoClient().db.coll coll.insert_many( [ {"start": "string", "prop": {"name": "foo", "start": 0}}, {"start": "string", "prop": {"name": "bar", "start": 10}}, ] ) arrow_table = find_arrow_all( coll, {}, schema=Schema({"start": str, "prop": struct([field("start", int32())])}) ) print(arrow_table) pyarrow.Table start: string prop: struct<start: int32> child 0, start: int32 ---- start: [["string","string"]] prop: [ -- is_valid: all not null -- child 0 type: int32 [0,10]]
Puedes hacer lo mismo al usar Pandas y NumPy:
df = find_pandas_all( coll, {}, schema=Schema({"start": str, "prop": struct([field("start", int32())])}) ) print(df) start prop 0 string {'start': 0} 1 string {'start': 10}
Datos anidados con proyecciones
También puede usar proyecciones para simplificar los datos antes de pasarlos a PyMongoArrow. El siguiente ejemplo ilustra cómo hacerlo mediante una estructura de documento anidada muy simple:
df = find_pandas_all( coll, { "prop.start": { "$gte": 0, "$lte": 10, } }, projection={"propName": "$prop.name", "propStart": "$prop.start"}, schema=Schema({"_id": ObjectIdType(), "propStart": int, "propName": str}), ) print(df) _id propStart propName 0 b'c\xec2\x98R(\xc9\x1e@#\xcc\xbb' 0 foo 1 b'c\xec2\x98R(\xc9\x1e@#\xcc\xbc' 10 bar
Al realizar una operación de agregación, puede aplanar los campos utilizando la etapa $project, como se muestra en el siguiente ejemplo:
>>> df = aggregate_pandas_all( ... coll, ... pipeline=[ ... {"$match": {"prop.start": {"$gte": 0, "$lte": 10}}}, ... { ... "$project": { ... "propStart": "$prop.start", ... "propName": "$prop.name", ... } ... }, ... ], ... )