Para agentes de IA: hay un índice de documentación disponible en https://www.mongodb.com/es/docs/llms.txt — versiones en markdown de todas las páginas están disponibles agregando .md a cualquier ruta URL.
Docs Menu

Integra MongoDB con Feast

Feast proporciona una API de FeatureStore de alto nivel que te permite definir funcionalidades y grupos de funcionalidades (vistas de características), almacenamiento en línea y fuera de línea, y la capacidad de mover dinámicamente datos del almacenamiento fuera de línea al almacenamiento en línea (materialización). La integración de MongoDB permite usar MongoDB como almacén en línea y almacén offline para Feast, lo que facilita definir funcionalidades una sola vez y servirlas de forma consistente tanto en el entrenamiento de modelos como en la inferencia en línea, sin necesidad de mantener sistemas de almacenamiento separados.

El modelo flexible de documentos de MongoDB y MQL le permiten manejar los complejos patrones de consulta requeridos por el almacén offline. Para la tienda online, MongoDB está optimizado para los patrones de acceso a escala web: lecturas/escrituras rápidas, escalabilidad horizontal y esquemas flexibles que minimizan uniones y viajes de ida y vuelta.

En esta visión general de la integración, puedes encontrar:

  • Una introducción a MongoDB como tienda en línea y fuera de línea de Feast.

  • Cómo los conceptos de Feast se mapean a MongoDB.

  • Explicaciones detalladas de los diseños de las tiendas offline y online de MongoDB.

  • Ejemplos de configuración para establecer los almacenes de MongoDB en Feast.

  • La tienda en linea es un almacén clave-valor respaldado por una única colección de MongoDB, optimizada para la recuperación de baja latencia de las últimas funcionalidades por entidad durante la inferencia en linea.

  • La tienda offline es una capa de computación y traducción que **query** filas de datos históricos de **funcionalidad** almacenados en una **colección** de **MongoDB** (normalmente llamada feature_history) para conjuntos de **datasets** de **entrenamiento**, puntuación y materialización (promocionando datos a la tienda **en linea**).

Un flujo de trabajo típico de extremo a extremo se ve así:

  1. Define entidades, vistas de características y fuentes de datos que apunten a colecciones respaldadas por MongoDB.

  2. Incorpora datos de características en el almacén offline mediante offline_write_batch, que acepta una tabla PyArrow como input e inserta los datos en la colección de MongoDB feature_history siguiendo el esquema del almacén offline.

  3. Genera datos de entrenamiento utilizando get_historical_features, que ejecuta una unión eficiente en el tiempo sobre filas de características históricas almacenadas en MongoDB.

  4. Materialice los últimos valores de las funcionalidades desde la tienda offline en la tienda en linea mediante pull_latest_from_table_or_query y online_write_batch.

  5. Sirve funcionalidades en linea a través de las APIs en linea de Feast, que leen de una única colección de MongoDB indexada por una clave de entidad serializada.

La integración de MongoDB sigue el modelo conceptual estándar de Feast, pero asigna esas abstracciones a un esquema de MongoDB diseñado para documentos en línea centrados en la entidad y eventos históricos de solo anexión.

Concepto Fiesta
Rol en el banquete
Representación de MongoDB

entidad

Objeto de dominio que describen las funcionalidades (por ejemplo, driver, usuario)

Codificado en una clave de entidad serializada; almacenado como _id en la tienda en línea y entity_id en la tienda fuera de línea.

Clave de unión

Columna(s) utilizadas para identificar una fila de entidad en un dataframe.

Se ingresa a serialize_entity_key; los bytes resultantes se utilizan como identificador de la entidad en MongoDB.

Clave de entidad serializada

Codificación binary determinista de nombres y valores de claves de unión.

En linea: _id: serialized_entity_key (llave primaria). Desconectado: entity_id: Binary(...) campo en feature_history document.

funcionalidad

Medición nombrada y tipada en un punto determinado.

Un campo dentro del subdocumento features (sin conexión) o features.<feature_view>.<feature_name> (en linea).

FeatureView

Vincula funcionalidades a entidades, fuente de datos y TTL; unidad de organización.

Sin conexión: feature_view string de discriminador en cada document histórico. En linea: grupos anidados bajo features.<feature_view> y marcas de tiempo por-FV en event_timestamps.

DataSource

Puntero de metadatos que indica dónde residen las funcionalidades históricas.

MongoDBSource apuntando a una colección de MongoDB (database, collection, connection_string) más marcas de tiempo.

OfflineStore

Interfaz de lectura/escritura para funcionalidades históricas y uniones PIT.

MongoDBOfflineStore implementación que ejecuta agregaciones de MQL en una colección feature_history compartida con un índice compuesto.

OnlineStore

Almacén de baja latencia de los valores más recientes de las funcionalidades por entidad.

Colección única de MongoDB de document de entidad identificados por _id = serialized_entity_key, con subdocumentos features y event_timestamps anidados.

TTL

Vent de la ventana de en el nivel de la FeatureView.

Impuesto en las consultas fuera de línea y postfiltrado en Python al calcular funcionalidades históricas; también puede combinarse con created_timestamp o updated_at en índices.

FeatureService

Lista denominada de referencias de funcionalidad para un model.

No hay una representación directa de MongoDB; Feast la utiliza para decidir de qué rutas features.<feature_view>.<feature_name> leer en la tienda en línea.

Registro

Almacén de metadatos para entidades, vistas de características y servicios.

Sin cambios; la integración de MongoDB no reemplaza el registro de Feast.

RetrievalJob

Contenedor de ejecución diferida que devuelve tablas de funcionalidades.

Para MongoDB offline store, encapsula una agregación MQL y expone exportaciones Arrow respaldadas por conversión de cursor a Arrow.

Materialización

Propagación programada de las últimas funcionalidades offline en la tienda en linea.

Implementado mediante pull_latest_from_table_or_query sobre feature_history y luego en online_write_batch en la colección de MongoDB en linea.

La tienda offline de MongoDB utiliza una sola colección compartida (por defecto feature_history) que almacena filas históricas de características sólo de adición para todas las vistas de características.

Cada document representa una observación de una entidad para un FeatureView en una marca de tiempo de evento específica:

{
"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
}
}

Propiedades clave:

  • Solo añadir: los datos históricos se tratan como inmutables; las correcciones se escriben como nuevas filas con marcas temporales más recientes de created_at en lugar de actualizaciones en el lugar.

  • Compatible con series temporales: event_timestamp representa cuándo se observó el valor de la funcionalidad; created_at se utiliza como criterio de desempate cuando varias observaciones comparten la misma marca de tiempo del evento.

  • Agrupación por FeatureView: feature_view identifica a qué FeatureView pertenece la fila, por lo que una única colección puede alojar varios FV.

Un solo índice compuesto admite todos los patrones de query principales:

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

Este índice permite escaneos eficientes de rango sobre entidades y vistas de características, mientras garantiza que la observación más reciente por (entity_id, feature_view) se vea primero durante la agregación.

Cómo el índice compuesto sirve a cada query emitida por el almacén sin conexión.

Query patrón
Comportamiento del índice

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

Exploración por rango de índices en el prefijo (entity_id, feature_view).

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

La ordenación no realiza ninguna operación: el orden del índice coincide con el orden de clasificación.

$group $first

El cursor visita por primera vez el último document por (entity_id, feature_view); $group $first lo selecciona inmediatamente.

pull_latest_from_table_or_query

$match { feature_view } + $group $first por entity_id — escaneo parcial del prefijo en (entity_id, feature_view).

Sin este índice, los cuatro patrones de query se degradan a COLLSCAN. El índice se crea de forma perezosa en el primer uso a través de _ensure_indexes, almacenado en caché por cadena de conexión en un conjunto de nivel de proceso _indexes_ensured, de modo que solo se crea una vez por duración del proceso.

La tienda offline de MongoDB implementa la interfaz estándar de tienda offline de Feast:

  • offline_write_batch - Escribe un pyarrow.Table de datos de funcionalidades en la colección subyacente de MongoDB, utilizando la MongoDBSource configurada de metadatos para determinar connection_string, database y collection.

  • get_historical_features - Dada una entity_df de entidades y marcas de tiempo de eventos más un conjunto de FeatureViews, devuelve una tabla ampliada donde cada fila incluye valores de funcionalidad correctos en el punto en el tiempo: para cada par (entity_id, event_timestamp), se selecciona el valor de funcionalidad más reciente cuyo event_timestamp <= entity_event_timestamp y dentro del TTL.

  • pull_latest_from_table_or_query - Devuelve una fila por entidad que contiene los valores de características más recientes en una ventana temporal, utilizada por el motor de materialización de Feast para sembrar la tienda en línea.

  • pull_all_from_table_or_query - Recupera todas las filas de una fuente de datos en un intervalo de fechas especificado para exportar o inspeccionar, respaldada por el mismo esquema e índice de feature_history.

  • persist (a través de RetrievalJob.persist) - Guarda el resultado de una consulta de funcionalidades históricas en una colección separada o en un sumidero externo a través de SavedDatasetStorage, diferente de feature_history.

Semánticas de escritura solo de anexos, procesamiento por lotes y resolución de conflictos.

Ruta de llamada:

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 de solo anexado: Los documentos se insertan con insert_many(ordered=False) en 10,000documentos por lote. No existe inserción ni deduplicación en el momento del guardado: se permiten y retienen varios documentos para el mismo (entity_id, feature_view, event_timestamp) tuple.

La resolución de conflictos se aplaza hasta el momento de la lectura:

  • pull_latest_from_table_or_query selecciona el document con el created_at más alto dentro del grupo ganador event_timestamp.

  • get_historical_features (scoring path) usa $sort … created_at DESC para que $group $first también seleccione el mejor created_at cuando las marcas de tiempo estén empatadas.

Una corrección escrita con un created_at posterior, por lo tanto, prevalece sin ninguna operación de eliminación o actualización.

Etapas completas de agregación utilizadas para la recuperación más reciente de funcionalidades.

pull_latest_from_table_or_query devuelve una fila por entidad con los valores más recientes de funcionalidad en una ventana de [start_date, end_date]. No se suministra entity_df.

Etapas de la 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.* }

El índice compuesto sirve el $match + $sort eficientemente; $group $first selecciona un document por entidad sin materializar el resto.

La implementación offline recomendada es la tienda offline basada en agregación de MongoDB, llamada MongoDBOfflineStore.

Características clave:

  • Utiliza una única colección feature_history compartida por todas las Visualizaciones de Características, diferenciada por feature_view.

  • Se apoya en el índice compuesto (entity_id, feature_view, event_timestamp, created_at) para todas las consultas, evitando el escaneo completo de la colección.

  • Utiliza $group $first del lado del servidor para cargas de trabajo de "puntuación" (una fila por entidad), y pd.merge_asof para cargas de trabajo de "entrenamiento" con identificadores de entidad repetidos, equilibrando la corrección y el rendimiento.

  • Uso de memoria limitado mediante el procesamiento por partes, para que se puedan procesar grandes valores de entity_df sin agotar la memoria RAM.

Los benchmarks muestran que esta implementación ofrece la mejor combinación de rendimiento y eficiencia de memoria en comparación con los enfoques alternativos de MongoDB offline.

Unión puntual, puntuación frente a rutas de entrenamiento y compensaciones de corrección.

get_historical_features es la API central de Feast. Acepta un entity_df (N filas de columnas de claves de entidad + event_timestamps) y K objetos FeatureView y devuelve un DataFrame con las mismas N filas más M columnas de características, con valores correctos en cada event_timestamp de fila (exactitud por punto en el tiempo).

Notación:

  • N → número de entidades

  • M → número de funcionalidades

  • P → número de observaciones

  • F → número de vistas de funcionalidades

  • K → número de vistas de funcionalidades solicitadas en una sola llamada get_historical_features

Ruta de puntuación

La ruta de puntuación se activa cuando entity_df no tiene IDs de entidad repetidos: el escenario de inferencia común donde cada fila solicita las características para una entidad distinta en un momento distinto.

Detección:

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

Al puntuar, se agrega la etapa $group $first del lado del servidor:

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

The $group groups by (entity_id, feature_view) and picks the document with the highest (event_timestamp, created_at) — i.e., the first document in order after the preceding $sort. MongoDB never materialises the other P-1 documentos for each entity per vista de funcionalidad; the cursor simply advances to the siguiente clave de grupo after picking one documento. El costo por entidad es O(log P) (búsqueda en el índice) en lugar de O(P).

El $match usa event_timestamp: {$lte: max_ts} donde max_ts es la marca de tiempo máxima de solicitud de entidad en el fragmento actual. Esta es una aproximación conservadora (la “Superación”): el servidor puede devolver document ligeramente en el futuro para algunas entidades. El postfiltro de Python a continuación corrige esto, anulando las filas no vá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 es una única llamada pd.merge seguida de una indexación booleana vectorizada — trabajo O(N) en código C de Pandas, independiente de P y M.

Ruta de entrenamiento

Cuando entity_df tiene ids de entidad repetidas (un conjunto de datasets de entrenamiento con muchas instancias de snapshot por entidad), se omite la etapa $group. La agregación devuelve todos los documents en la ventana de marca de tiempo para cada entidad, y Python utiliza pd.merge_asof para encontrar el document más reciente en o antes de la event_timestamp de cada fila:

$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",
)

Fragmentación en dos niveles para controlar el uso de memoria en grandes datasets.

Dos niveles de control de segmentación controlan el uso de memoria:

Nivel
Constante
Propósito

Exterior CHUNK_SIZE

50,000 filas

Limites entity_df slice pasada a _run_single; caps peak result DataFrame en Python.

Interno MONGO_BATCH_SIZE

ID de entidad 10,000

Limita el tamaño del arreglo {$in: [...]} por cada llamada de agregación; previene mensajes BSON demasiado grandes.

Para entity_df más grande que CHUNK_SIZE, el bucle externo ejecuta varias llamadas _run_single y concatena los 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)

Por lo tanto, la memoria máxima en el lado de Python es O(CHUNK_SIZE x M x K) independientemente del valor total de N.

Extracción de funcionalidades de subdocumentos de MongoDB en columnas de DataFrame.

El subdocumento de MongoDB features se expande en columnas individuales utilizando pd.apply en lugar de pd.json_normalize. Esto conserva tipos complejos (dicts para Mapa y Estructura, listas para arreglo) que json_normalize aplanaría o perdería. También se aplica la asignación de campo inversa para que los nombres de columnas proyectadas coincidan con la definición de 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"])
Capacidad
¿Admitido?
notas

get_historical_features (PIT join)

Implementado a través de MongoDBOfflineStore utilizando agregaciones indexadas y Pandas merge-asof.

pull_latest_from_table_or_query

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

pull_all_from_table_or_query

Análisis histórico completo con filtros de tiempo sobre feature_history.

offline_write_batch

Escribe tablas Arrow en MongoDB a través del MongoDBSource configurado.

persist

Exporta los resultados históricos de query a una colección separada usando SavedDatasetStorage.

Las comodidades adicionales, como la exportación directa a lagos de datos o almacenes, dependen de la implementación específica de RetrievalJob y se espera que sigan los patrones estándar de Feast para almacenes offline.

La tienda en línea de MongoDB utiliza una única colección para todas las FeatureViews, indexada por la clave de entidad serializada.

  • _id: serialized_entity_key(entity_key), producido por la función de codificación estable de Feast que ordena los nombres y valores de las entidades y los codifica en bytes.

  • featuressubdocumento anidado donde cada FeatureView mantiene su propio namespace de funcionalidades.

  • event_timestamps● timestamps por FeatureView que indican cuándo se escribió el último valor para ese FeatureView.

  • created_timestamp o updated_at: campos de contabilidad útiles para la indexación TTL y la diagnostica.

Ejemplo (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)"
}

Justificación del diseño:

  • Una única colección mantiene el estado de cada entidad en un solo document, lo que coincide con la expectativa de Feast de búsquedas basadas en claves y evita el fraccionamiento del estado entre colecciones por FeatureView.

  • El uso de la clave de entidad serializada como _id reutiliza la codificación determinista de Feast, evita llaves primarias duplicadas en diferentes colecciones y mantiene la recuperación en solo una búsqueda de clave por entidad.

Justificación detallada del diseño para los esquemas de tiendas en línea y fuera de línea.

Al igual que la tienda sin conexión (que utiliza una sola colección feature_history con un campo de discriminador feature_view), la tienda en linea también utiliza una sola colección para todas las FeatureViews.

La tienda en línea es fundamentalmente orientada a la clave de entidad, no orientada a la vista de funcionalidades. Aunque la API de FeatureStore de alto nivel invoca online_read y online_write_batch con una única Vista de Características, el model de almacenamiento subyacente en Feast está diseñado en torno a una única fila lógica por clave de entidad. Esa fila puede acumular atributos de varios Vistas de atributos a lo largo del tiempo.

Utilizar una única colección nos permite mantener un documento unificado por entidad y actualizar solamente el subdocumento relevante (p. ej., features.<feature_view_name>) de manera atómica, sin duplicar las claves de entidad entre las colecciones.

Un diseño de colección única fue el estándar para Feast desde el principio (originalmente se diseñó para Redis) y aprovecha las fortalezas de MongoDB. Los beneficios incluyen:

  • Amplificación de guardar reducida

  • Gestión simplificada de índices (solo un índice primario _id)

  • No existe coordinación entre colecciones cuando múltiples FeatureViews comparten las mismas entidades

  • Semántica coherente de recuperación con el model de obtención basado en claves de Feast

Un diseño de colección por FeatureView fragmentaría el estado de la entidad, requeriría coordinación adicional o queries de múltiples colecciones si alguna vez se componen las funcionalidades, y aumentaría la sobrecarga operativa sin una ventaja de rendimiento para el patrón de acceso de Feast.

Clave de entidad serializada como _idFeast proporciona serialize_entity_key, una función de codificación estable que ordena explícitamente los nombres y valores de las entidades antes de concatenarlos para garantizar una secuencia de bytes predecible (con escritura tipada con struct.pack y produciendo bytes). Esto significa que podemos utilizarlo directamente como el _id.

Nota

Mientras que serialize_entity_key proporciona un _id estable, su resultado no está distribuido uniformemente y, por lo tanto, no es ideal para particionado. Si su implementación requiere particionar la colección de tiendas en línea, considere una clave de partición con hash o un campo adicional.

La tienda en línea de MongoDB implementa la API estándar de la tienda en línea de Feast:

  • online_write_batch - Durante la materialización, Feast guarda los valores actuales de las funcionalidades de cada entidad en los documents de MongoDB. Cada actualización de upsert por lote actualiza solo el subdocumento anidado correspondiente features.<feature_view> y su entrada correspondiente en event_timestamps, manteniendo los document de la entidad atómicos y consistentes.

  • online_read y get_online_features: la prestación en línea resuelve las claves de entidad en valores _id utilizando la misma lógica de serialización que fuera de línea y, a continuación, realiza búsquedas de claves. Cada búsqueda devuelve todas las funcionalidades solicitadas para la entidad en un solo viaje de ida y vuelta, aprovechando la estructura anidada features.

  • TTL y frescura: el TTL de la funcionalidad se configura en el FeatureView y se utiliza principalmente en uniones PIT fuera de línea; el TTL en linea puede implementarse con un índice en updated_at o en una marca de tiempo similar, en consonancia con la noción de Feast de que los almacenes fuera de línea solo agregan, mientras que los almacenes en linea mantienen el estado más reciente.

La tienda offline se configura usando MongoDBOfflineStoreConfig:

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

Ejemplo 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 es el DataSource correspondiente. Su name campo se convierte en el discriminador feature_view almacenado en cada document. Para conocer todas las opciones de configuración, consulta la referencia MongoDB fuente de datos en los Feast Docs.

source = MongoDBSource(
name="driver_stats",
timestamp_field="event_timestamp",
created_timestamp_column="created_at",
)
  • Sigue el inicio rápido de Feast para configurar una tienda de características local y luego intercambiar MongoDB como tienda en linea y offline utilizando los ejemplos de configuración de esta página.

  • Consulta la tienda en linea MongoDB referencia en la documentación de Feast para opciones de configuración, compatibilidad asíncrona y la matriz completa de funcionalidades.

  • Consulta la MongoDB Offline Store documentación de referencia para la configuración de la tienda offline y la funcionalidad compatible.

  • Revisa la referencia de Fuente de datos de MongoDB para obtener opciones de MongoDBSource y detalles del esquema.

  • Aprende los conceptos básicos de Feast, como entidades, vistas de características y materialización en la Guía de conceptos de Feast.