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(... coll, {}, schema=Schema({"start": str, "prop": struct([field("start", int32())])})... )... print(arrow_table)pyarrow.Tablestart: stringprop: 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(... coll, {}, schema=Schema({"start": str, "prop": struct([field("start", int32())])})... )... print(df) start prop0 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,... }... },... projection={"propName": "$prop.name", "propStart": "$prop.start"},... schema=Schema({"_id": ObjectIdType(), "propStart": int, "propName": str}),... )... print(df) _id propStart propName0 b'c\xec2\x98R(\xc9\x1e@#\xcc\xbb' 0 foo1 b'c\xec2\x98R(\xc9\x1e@#\xcc\xbc' 10 barAo 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",... }... },... ],... )