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 cuando uses 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 puedes utilizar proyecciones para aplanar los datos antes de pasarlos a PyMongoArrow. El siguiente ejemplo ilustra cómo hacer esto utilizando una estructura de documento anidada muy sencilla:
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, puedes aplanar los campos usando 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", ... } ... }, ... ], ... )