Menu Docs
Página inicial do Docs
/ / /
PyMongoArrow

Exemplos de esquema

Nesta página

  • Dados aninhados com esquema
  • Dados aninhados com projeção

Este guia mostra exemplos de como usar esquemas PyMongoArrow em situações comuns.

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.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(
... coll, {}, schema=Schema({"start": str, "prop": struct([field("start", int32())])})
... )
... print(df)
start prop
0 string {'start': 0}
1 string {'start': 10}

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 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",
... }
... },
... ],
... )

Voltar

Tipos de dados