Para agentes de IA: um índice de documentação está disponível em https://www.mongodb.com/pt-br/docs/llms.txt — as versões de markdown de todas as páginas estão disponíveis anexando .md a qualquer caminho de URL.
Menu Docs

Integre o MongoDB com o Feast

Feast fornece uma API de alto nível do FeatureStore que permite definir recursos e grupos de recursos (visualizações de recursos), armazenamento online e offline e a capacidade de mover dinamicamente dados do armazenamento offline para o online (materialização). A integração do MongoDB permite que você use o MongoDB como uma loja online e offline para o Feast, para que você possa definir os recursos uma vez e servi-los consistentemente por meio do treinamento de model e da inferência online sem manter sistemas de armazenamento separados.

O modelo de document model flexível e o MQL do MongoDB permitem que ele lide com os padrões de query complexos necessários para o armazenamento offline. Para a loja online, o MongoDB é otimizado para padrões de acesso em escala web – leituras/gravações rápidas, dimensionamento horizontal e esquemas flexíveis que minimizam junções e idas e voltas.

Nesta visão geral da integração, você pode encontrar:

  • Uma introdução ao MongoDB como a loja online e offline da Feast.

  • Como os conceitos de Feast são mapeados para o MongoDB.

  • Explicações detalhadas dos projetos de loja offline e online do MongoDB .

  • Exemplos de configuração para configurar as lojas MongoDB no Feast.

  • A loja online é um armazenamento de valores-chave apoiado por uma única coleção do MongoDB, otimizado para recuperação de baixa latência dos recursos mais recentes por entidade durante a inferência online.

  • A loja offline é uma camada de computação e tradução que consulta linhas de dados históricos de funcionalidades armazenados em uma coleção do MongoDB (normalmente chamada de feature_history) para conjuntos de dados de treinamento, pontuação e materialização (promoção de dados para a loja online).

Um fluxo de trabalho típico de ponta a ponta é assim:

  1. Defina entidades, visualizações de recursos e fontes de dados que ponto para coleções apoiadas MongoDB.

  2. A ingestão de dados de recursos no armazenamento offline por meio do offline_write_batch, que aceita uma tabela PyArrow como input e insere os dados na coleção feature_history MongoDB seguindo o esquema do armazenamento offline.

  3. Gere dados de treinamento usando o get_historical_features, que executa uma conexão eficiente de ponto no tempo em linhas de recursos históricos armazenadas no MongoDB.

  4. Materialize os valores de funcionalidades mais recentes da loja offline para a loja online usando pull_latest_from_table_or_query e online_write_batch.

  5. Sirva recursos online por meio das APIs online do Feast, que leem de uma única coleção do MongoDB chaveada por uma chave de entidade serializada.

A integração do MongoDB segue o model conceitual padrão da Feast, mas mapeia essas abstrações para um esquema do MongoDB projetado para document online focados em entidades e eventos históricos somente para anexar.

Conceito de festividade
Função na festividade
Representação do MongoDB

entidade

objeto de domínio que os recursos descrevem (por exemplo driver, usuário).

Codificado em uma chave de entidade serializada; armazenado como _id na loja online e entity_id na loja offline.

Chave de acesso

Coluna(s) usada(s) para identificar uma linha de entidade em um dataframe.

Distribuído em serialize_entity_key; os bytes resultantes são usados como identificador de entidade no MongoDB.

Chave de entidade serializada

Codificação binary determinística de nomes e valores de chave de junção.

Online: _id: serialized_entity_key (chave primária). Offline: entity_id: Binary(...) campo em feature_history documentos.

funcionalidade

Medição nomeada e digitada em um ponto no tempo.

Um campo dentro do subdocumento features (offline) ou features.<feature_view>.<feature_name> (online).

FeatureView

Vincula recursos a entidades, fonte de dados e TTL; unidade de organização.

Offline: feature_view string discriminadora em cada document histórico. Online: grupos aninhados em features.<feature_view> e registros de data/hora por FV em event_timestamps.

DataSource

Ponteiro de metadados para onde as características históricas ao vivo.

MongoDBSource apontando para uma coleção MongoDB (database, collection, connection_string) mais timestamps.

OfflineStore

Interface de leitura/gravação para recursos históricos e entradas de PIT.

MongoDBOfflineStore implementação que executa agregações MQL em uma coleção de feature_history compartilhada com um índice composto.

OnlineStore

Armazenamento de baixa latência dos valores de recursos mais recentes por entidade.

Collection única do MongoDB de document de entidade chaveados por _id = serialized_entity_key, com subdocumentos features e event_timestamps aninhados.

TTL

Janela de atualização no nível do FeatureView.

Aplicado em queries offline e pós-filtragem do Python ao calcular funcionalidades históricas; também pode ser combinado com created_timestamp ou updated_at em índices.

FeatureService

Lista nomeada de referências de recursos para um model.

Nenhuma representação direta do MongoDB; usado pelo Feast para decidir quais features.<feature_view>.<feature_name> caminhos ler do armazenar online.

Registro

Armazenamento de metadados para entidades, visualizações de recursos e serviços.

Inalterado; A integração do MongoDB não substitui o registro Feast.

RetrievalJob

Tabelas de recursos de retorno do wrapper de execução adiada.

Para o armazenar offline do MongoDB, encapsula uma agregação MQL e expõe exportações de setas apoiadas pela conversão de cursor para seta.

Materialização

Propagação programada dos recursos offline mais recentes na loja online.

Implementado via pull_latest_from_table_or_query sobre feature_history e depois online_write_batch na coleção MongoDB online.

O armazenamento offline do MongoDB usa uma única coleção compartilhada (por padrão feature_history) que armazena linhas de recursos históricos somente anexados para todas as visualizações de recursos.

Cada document representa uma observação de uma entidade para um FeatureView em um registro de data/hora de evento específico:

{
"entity_id": "Binary(...)",
"feature_view": "driver_stats",
"event_timestamp": "ISODate(2024-01-15T12:00:00Z)",
"created_at": "ISODate(2024-01-15T12:01:00Z)",
"features": {
"conv_rate": 0.72,
"acc_rate": 0.91,
"avg_daily_trips": 14
}
}

Propriedades principais:

  • Somente anexar: os dados históricos são tratados como imutáveis; as correções são escritas como novas linhas com registros de data/hora created_at mais recentes em vez de atualizações no local.

  • Compatível com séries temporais: event_timestamp representa quando o valor do recurso foi observado; created_at é usado como desempate quando várias observações compartilham o mesmo carimbo de data/hora do evento .

  • Agrupamento de recursos por FeatureView: feature_view identifica a qual FeatureView a linha pertence, de modo que uma única coleção possa hospedar vários FVs.

Um único índice composto suporta todos os principais padrões de query:

(entity_id ASC, feature_view ASC, event_timestamp DESC, created_at DESC)

Esse índice permite varreduras de faixa eficientes sobre entidades e visualizações de recursos, enquanto garante que a observação mais recente por (entity_id, feature_view) seja vista primeiro durante a agregação.

Como o índice composto atende a cada query emitida pela loja offline.

Padrão de query
Comportamento do índice

$match { entity_id: {$in: [...]}, feature_view: {$in: [...]} }

Varredura de faixa de índice no prefixo (entity_id, feature_view).

$sort { entity_id, feature_view, event_timestamp DESC, created_at DESC }

A classificação é um no-op — a ordem do índice corresponde à ordem de classificação.

$group $first

O cursor visita o latest document per (entity_id, feature_view) first; $group $first a escolhe imediatamente.

pull_latest_from_table_or_query

$match { feature_view } + $group $first por entity_id — varredura parcial de prefixo em (entity_id, feature_view).

Sem esse índice, todos os quatro padrões de query são degradados para COLLSCAN. O índice é criado lentamente no primeiro uso por meio de _ensure_indexes, armazenado em cache por string de conexão em um conjunto _indexes_ensured no nível do processo, portanto, é criado apenas uma vez por tempo de vida do processo.

A loja offline do MongoDB implementa a interface de loja offline padrão do Feast:

  • offline_write_batch - Grava um pyarrow.Table dos dados de recursos na coleção subjacente do MongoDB, usando os metadados MongoDBSource configurados para determinar connection_string, database e collection.

  • get_historical_features - Dado um entity_df de entidades e registros de data/hora de evento , além de um conjunto de FeatureViews, retorna uma tabela ampliada em que cada linha inclui valores de recursos corretos point-in-time: para cada par (entity_id, event_timestamp), o valor de recurso mais recente cujo event_timestamp <= entity_event_timestamp e dentro de TTL estiver selecionado.

  • pull_latest_from_table_or_query - Retorna uma linha por entidade contendo os valores de recurso mais recentes em uma janela de tempo, usada pelo mecanismo de materialização do Feast para semear o armazenar online.

  • pull_all_from_table_or_query - Recupera todas as linhas de uma fonte de dados em uma faixa de datas especificada para exportação ou inspeção, apoiado pelo mesmo esquema e índice do feature_history.

  • persist (via RetrievalJob.persist) - Grava o resultado de uma query de recurso histórico em uma coleção separada ou coletor externo via SavedDatasetStorage, distinto de feature_history.

Anexar semântica de gravação, lote e resolução de conflitos somente .

Caminho da chamada:

FeatureStore.write_to_offline_store(feature_view_name, df)
→ provider.ingest_df_to_offline_store(feature_view, arrow_table)
→ OfflineStore.offline_write_batch(config, feature_view, table, progress)

Semântica somente anexa: os documents são inseridos com insert_many(ordered=False) em 10,000- lotes de document. Não há upsert ou eliminação de duplicação no momento da gravação — vários documentos para a mesma tupla (entity_id, feature_view, event_timestamp) são permitidos e retidos.

A resolução de conflitos é adiada para o tempo de leitura:

  • pull_latest_from_table_or_query picks the document with the highest created_at within the winning event_timestamp group.

  • get_historical_features (caminhos de pontuação) usa $sort … created_at DESC, portanto, $group $first também seleciona o created_at mais alto quando os registros de data e hora se vincularem.

Uma correção escrita com um created_at posterior vence sem qualquer operação de exclusão ou atualização.

Estágios de agregação completos utilizados para a recuperação de funcionalidades mais recente.

pull_latest_from_table_or_query retorna uma linha por entidade com os valores de recurso mais recentes em uma janela [start_date, end_date]. Nenhum entity_df é fornecido.

Estágios do pipeline:

$match { feature_view, event_timestamp: {$gte, $lte} }
→ $sort { entity_id, event_timestamp DESC, created_at DESC }
→ $group $first by entity_id
→ $project { entity_id, event_timestamp, features.* }

O índice composto serve $match + $sort eficientemente; $group $first escolhe um document por entidade sem materializar o resto.

A implementação offline recomendada é o armazenamento offline do MongoDB baseado em agregação, denominado MongoDBOfflineStore.

Características principais:

  • Utiliza uma única coleção feature_history compartilhada por todos os FeatureViews, distinguidos por feature_view.

  • Confia no índice composto (entity_id, feature_view, event_timestamp, created_at) para todas as queries, evitando varreduras completas da coleção.

  • Usa o $group $first do lado do servidor para cargas de trabalho de "pontuação" (uma linha por entidade) e pd.merge_asof para cargas de trabalho de "treinamento" com IDs de entidade repetidas, equilibrando correção e desempenho.

  • Uso de memória limitada por meio de **parte**s, portanto, valores entity_df grandes podem ser processados sem esgotar a RAM.

Os benchmarks mostram que essa implementação fornece a melhor combinação de taxa de transferência e eficiência de memória em comparação com abordagens offline alternativas do MongoDB .

Junção pontual, pontuação versus caminhos de treinamento e compensações de correção.

get_historical_features é a API principal do Feast. Ele aceita um entity_df (N linhas de colunas de chave de entidade + event_timestamps) e K FeatureView objetos e retorna um DataFrame com as mesmas linhas N mais colunas de recurso M, com valores corretos no event_timestamp de cada linha (ponto- correção in-time).

Notação:

  • N → número de entidades

  • M → número de funcionalidades

  • P → número de observações

  • F → número de visualizações de recursos

  • K → número de visualizações de funcionalidades solicitadas em uma única get_historical_features chamada

Caminho de pontuação

O caminho de pontuação é ativado quando entity_df não tem IDs de entidade repetidos — o cenário de inferência comum em que cada linha solicita as funcionalidades de uma entidade distinta em um ponto de tempo distinto.

Detecção:

scoring_path = (
entity_df[all_entity_id_cols].drop_duplicates().shape[0]
== len(entity_df)
)

Ao pontuar, o estágio $group $first do lado do servidor é adicionado:

$match → $sort → $group $first → $project

O $group agrupa por (entity_id, feature_view) e escolhe o document com o (event_timestamp, created_at) mais alto — ou seja, o primeiro document na ordem do índice após o $sort anterior. O MongoDB nunca materializa os outros documentos P-1 para cada entidade por visualização de recurso; o cursor simplesmente avança para a próxima chave de grupo depois de escolher um documento. O custo por entidade é O(log P) (busca do índice) em vez de O(P).

O $match usa event_timestamp: {$lte: max_ts}, em que max_ts é o carimbo de data/hora máximo de solicitação de entidade na parte atual. Esta é uma aproximação conservadora ("Oversync"): o servidor pode retornar document ligeiramente no futuro para algumas entidades. O pós-filtro do Python abaixo corrige isso anulando linhas inválidas:

# Merge on entity_id (left = entity_df rows, right = server results)
merged = result[["_fv_entity_id", event_timestamp_col]].merge(
fv_join, on="_fv_entity_id", how="left"
)
# Null out rows where the server doc is in the future or outside TTL
future_mask = merged["_fv_ts"] > merged[event_timestamp_col]
if fv.ttl:
ttl_mask = merged["_fv_ts"] < (
merged[event_timestamp_col] - fv.ttl
)
bad_mask = future_mask | ttl_mask
else:
bad_mask = future_mask
for feat in features:
vals = merged[feat].copy()
vals[bad_mask | merged["_fv_ts"].isna()] = None
result[col] = vals.values

Esta é uma única pd.merge chamar seguida de indexação booleano vetorizada — O(N) funciona no código Pandas C, independente de P e M.

Caminho de treinamento

Quando entity_df tem IDs de entidade repetidos (um datasets de treinamento com muitos snapshots de registros de data/hora por entidade), o estágio $group é omitido. A agregação retorna todos os documentos na janela de registro de data/hora para cada entidade, e o Python usa pd.merge_asof para localizar o mais recente document em ou antes do event_timestamp de cada linha:

$match → (no $group)
result = pd.merge_asof(
result.sort_values(event_timestamp_col),
fv_df_subset.sort_values("_fv_ts"),
left_on=event_timestamp_col,
right_on="_fv_ts",
by="_fv_entity_id",
direction="backward",
)

Particionamento de dois níveis para controlar o uso de memória para grandes datasets.

Dois níveis de partes controlam o uso da memória:

Nível
Constante
Propósito

Externo CHUNK_SIZE

50,000 linhas

Limita a fatia entity_df passada para _run_single; caps pico result DataFrame em Python.

Interno MONGO_BATCH_SIZE

10,000 IDs de entidade

Limita o tamanho da array {$in: [...]} por chamada de agregação ; evita mensagens BSON superdimensionadas.

Para entity_df maiores que CHUNK_SIZE, o loop externo executa várias chamadas _run_single e concatena os resultados:

if len(working_df) <= CHUNK_SIZE:
result_df = _run_single(working_df, coll)
else:
chunks = [
_run_single(chunk, coll)
for chunk in _chunk_dataframe(working_df, CHUNK_SIZE)
]
result_df = pd.concat(chunks, ignore_index=True)

O pico da memória do lado do Python é, portanto, O(CHUNK_SIZE x M x K), independentemente do total de N.

Extraindo recursos de subdocumentos do MongoDB para colunas DataFrame.

O subdocumento features do MongoDB é expandido em colunas individuais usando pd.apply em vez de pd.json_normalize. Isso preserva os tipos complexos (dicts para Map e Struct, listas para Array) que json_normalize nivelariam ou perderiam. O mapeamento de campo reverso também é aplicado para que os nomes das colunas projetadas correspondam à definição FeatureView:

if "features" in fv_df.columns:
for feat in features:
src_col = reverse_fm.get(feat, feat)
fv_df[feat] = fv_df["features"].apply(
lambda d, _s=src_col: (
d.get(_s) if isinstance(d, dict) else None
)
)
fv_df = fv_df.drop(columns=["features"])
Capacidade
Suportado?
Notas

get_historical_features (entrada do PIT)

Sim

Implementado via MongoDBOfflineStore usando agregações indexadas e Pandas merge-asof.

pull_latest_from_table_or_query

Sim

Usa $match + $sort + $group $first sobre (entity_id, feature_view, event_timestamp, created_at).

pull_all_from_table_or_query

Sim

Varredura histórica completa com filtros de tempo acima de feature_history.

offline_write_batch

Sim

Escreve tabelas de seta no MongoDB através do MongoDBSource configurado.

persist

Sim

Exporta resultados históricos da query para uma coleção separada usando SavedDatasetStorage.

Conveniências adicionais, como exportar diretamente para data lakes ou armazéns, dependem da implementação específica do RetrievalJob e espera-se que siga os padrões padrão da Feast para armazenamentos offline.

A loja online MongoDB usa uma única coleção para todos os FeatureViews, codificados pela chave de entidade serializada.

  • _id: serialized_entity_key(entity_key), produzido pela função de codificação estável do Feast que classifica os nomes e valores das entidades e os codifica em bytes.

  • features: subdocumento aninhado onde cada FeatureView mantém seu próprio namespace de funcionalidade .

  • event_timestamps: carimbos de data/hora por FeatureView que indicam quando o valor mais recente para esse FeatureView foi gravado.

  • created_timestamp ou updated_at: campos de contabilidade úteis para indexação e diagnóstico de TTL.

Exemplo (simplificado):

{
"_id": "b\"<serialized_entity_key>\"",
"features": {
"driver_stats": {
"rating": 4.91,
"trips_last_7d": 132
},
"pricing": {
"surge_multiplier": 1.2
}
},
"event_timestamps": {
"driver_stats": "ISODate(2026-01-01T12:00:00Z)",
"pricing": "ISODate(2026-01-21T12:00:00Z)"
},
"created_timestamp": "ISODate(2026-01-21T12:00:00Z)"
}

Fundamento do design:

  • Uma única coleção mantém o estado de cada entidade em um document, o que corresponde à expectativa do Feast de pesquisas baseadas em chaves e evita a fragmentação do estado nas coleções por FeatureView.

  • O uso da chave de entidade serializada como _id reutiliza a codificação determinística do Feast, evita chaves primárias duplicadas entre coleções e mantém a recuperação para uma única pesquisa de chave por entidade.

Fundamentos de design detalhados para os esquemas de armazenamento online e offline.

Como a loja offline (que usa uma única coleção feature_history com um campo discriminador feature_view), a loja online também usa uma única coleção para todos os FeatureViews.

A Loja Online é fundamentalmente orientada por chaves de entidade, e não por visualizações de recursos. Embora a API FeatureStore de alto nível invoque online_read e online_write_batch com um único FeatureView, o model de armazenamento subjacente no Feast é projetado em torno de uma única linha lógica por chave de entidade. Essa linha pode acumular recursos de vários FeatureViews ao longo do tempo.

O uso de uma coleção nos permite manter um document unificado por entidade e atualizar somente o subdocumento relevante (por exemplo, features.<feature_view_name>) atomicamente sem duplicar as chaves de entidade entre coleções.

Um único design de coleção foi o padrão para o Feast desde o início (foi originalmente projetado para o Redis) e joga com os pontos fortes do MongoDB. Os benefícios incluem:

  • Amplificação de gravação reduzida

  • Gerenciamento de índice simplificado (somente um índice _id primário)

  • Sem coordenação entre coleções quando vários FeatureViews compartilham as mesmas entidades

  • Semântica de recuperação consistente com o model de busca baseado em chaves do Feast

Um design de coleção por FeatureView fragmentaria o estado da entidade, exigiria coordenação adicional ou queries de várias coleções se os recursos fossem compostos e aumentasse a sobrecarga operacional sem uma vantagem de desempenho para o padrão de acesso do Feast.

Chave de entidade serializada como _id: o Feast fornece serialize_entity_key, uma função de codificação estável que classifica explicitamente os nomes e valores da entidade antes da concatenação para garantir uma sequência de bytes previsível ( digitada com struct.pack bytes de produção). Isso significa que podemos usá-lo diretamente como _id.

Observação

Embora serialize_entity_key forneça um _id estável, sua saída não é distribuída uniformemente e, portanto, não é ideal para fragmentação. Se a sua implantação exigir a fragmentação da coleção da loja online, considere uma chave de fragmento com hash ou um campo adicional.

A loja online do MongoDB implementa a API de loja online padrão da Feast:

  • online_write_batch - Durante a materialização, o Feast grava os valores de funcionalidade mais recentes para cada entidade nos documentos do MongoDB . Cada upsert de lote atualiza somente o subdocumento features.<feature_view> aninhado relevante e sua entrada correspondente em event_timestamps, mantendo os entity document atômicos e consistentes.

  • online_read e get_online_features - A entrega online resolve as chaves de entidade em valores _id usando a mesma lógica de serialização que offline e, em seguida, realiza pesquisas de chaves. Cada pesquisa retorna todos os recursos solicitados para a entidade em uma única viagem de ida e volta, aproveitando a estrutura features aninhada.

  • TTL e atualização — O recurso TTL é configurado no FeatureView e usado principalmente em junções de PIT offline; O TTL online pode ser implementado com um índice em updated_at ou registro de data e hora semelhante, consistente com a noção da Feast de que as lojas offline são somente para anexação, enquanto as lojas online mantêm o estado mais recente.

O armazenamento offline é configurado usando MongoDBOfflineStoreConfig:

class MongoDBOfflineStoreConfig(FeastConfigBaseModel):
type: str = "...MongoDBOfflineStore"
connection_string: str = "mongodb://localhost:27017"
database: str = "feast"
collection: str = "feature_history"

Exemplo feature_store.yaml:

offline_store:
type: feast.infra.offline_stores.contrib.mongodb_offline_store.mongodb.MongoDBOfflineStore
connection_string: "mongodb+srv://user:pass@cluster.mongodb.net"
database: feast
collection: feature_history

MongoDBSource é o DataSource correspondente. Seu name campo se torna o discriminador feature_view armazenado em todos os document. Para obter opções de configuração completas, consulte a referência da MongoDB Fonte de Dados nos Docs do Feast.

source = MongoDBSource(
name="driver_stats",
timestamp_field="event_timestamp",
created_timestamp_column="created_at",
)
  • Siga o Início Rápido do Feast para configurar um armazenamento de recursos local e, em seguida, trocar no MongoDB como um armazenamento online e offline usando os exemplos de configuração nesta página.

  • Revise a referência da MongoDB Online Store nos Feast Docs para obter opções de configuração, suporte assíncrono e a array de funcionalidade completa.

  • Revise a referência do armazenamento offline do MongoDB para obter a configuração do armazenamento offline e a funcionalidade compatível.

  • Revise a referência da Fonte de Dados MongoDB para obter opções MongoDBSource e detalhes de esquema.

  • Aprenda os principais conceitos do Feast, como entidades, visualizações de recursos e materialização, no guia Conceitos de Feast.