Exemplos de esquema
Este guia mostra exemplos de como usar esquemas PyMongoArrow em situações comuns.
Dados aninhados com esquema
Ao executar operações agregadas ou de localização, você pode fornecer um esquema para dados aninhados utilizando o objeto struct
. Pode haver nomes conflitantes em subdocumentos em comparação com seus documentos principais.
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("start": str, "prop": struct([field("start", int32())])}) coll, {}, schema=Schema({ )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]]
Você pode fazer a mesma coisa ao usar Pandas e NumPy:
df = find_pandas_all("start": str, "prop": struct([field("start", int32())])}) coll, {}, schema=Schema({ )print(df) start prop 0 string {'start': 0} 1 string {'start': 10}
Dados aninhados com projeção
Você também pode usar projeção para nivelar os dados antes de passá-los para o PyMongoArrow. O exemplo a seguir ilustra como fazer isso usando uma estrutura de documento aninhada muito simples:
df = find_pandas_all( coll, {"prop.start": { "$gte": 0, "$lte": 10, } },"propName": "$prop.name", "propStart": "$prop.start"}, projection={"_id": ObjectIdType(), "propStart": int, "propName": str}), schema=Schema({ )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
Ao executar uma operação agregada, você pode nivelar os campos usando o estágio $project
, como mostrado no seguinte exemplo:
>>> df = aggregate_pandas_all( ... coll, ... pipeline=[ ... {"$match": {"prop.start": {"$gte": 0, "$lte": 10}}}, ... { ... "$project": { ... "propStart": "$prop.start", ... "propName": "$prop.name", ... } ... }, ... ], ... )