
MongoDB Online Store 在线存储指南Feast 特征仓库的高性能 MongoDB 落地实践【免费下载链接】feastThe Open Source Feature Store for AI/ML项目地址: https://gitcode.com/GitHub_Trending/fe/feastMongoDB online store 是 Feast 官方提供的一种在线存储实现用于把特征值物化materialize到 MongoDB 中支撑在线特征检索online serving。本文围绕 docs/reference/online-stores/mongodb.md 展开从配置接入、数据模型、索引策略、异步支持到功能矩阵逐层展开并结合仓库内 MongoDBOnlineStore 源码 与集成测试帮助你理解其内部写入/读取原理并能在自己的特征仓库中直接落地使用。概述为什么选择 MongoDB 作为在线存储Feast 的在线存储负责以低延迟方式提供最新特征值支撑线上推理。MongoDB 作为文档型 NoSQL 数据库天然具备以下适合在线特征服务的能力支持 MongoDB Atlas、自建 MongoDB、MongoDB 副本集replica set等多种部署形态连接方式灵活文档模型适合按实体entity key聚合特征同一实体的多个特征视图feature view可以共存于同一文档中自动创建索引、实体键entity key同文档聚合collocation保证按实体键查询的高效性基于 PyMongo 4.13 的稳定版AsyncMongoClient提供原生异步读写支持无需引入 Motor 等额外依赖可支撑高并发在线特征请求。在 Feast 中MongoDB 在线存储的完整实现位于 sdk/python/feast/infra/online_stores/mongodb_online_store/mongodb.py配置模型为MongoDBOnlineStoreConfig核心类为MongoDBOnlineStore。快速开始安装与接入安装 MongoDB 扩展使用 MongoDB 在线存储前需要安装 Feast 的 MongoDB extra同时按需安装所选离线存储offline store的依赖pip install feast[mongodb]该 extra 依赖 PyMongo 客户端。从当前仓库的 CI 依赖锁定文件如 py3.12-ci-requirements.txt可以看到CI 环境中锁定的是pymongo4.17.0对应支持异步AsyncMongoClient的 PyMongo 4.13 版本线。从现有模板切换你可以使用任意 Feast 初始化模板例如feast init -t gcp、feast init -t snowflake、feast init -t aws生成特征仓库骨架然后在feature_store.yaml中把online_store部分替换为 MongoDB 配置即可离线存储部分保持不变。若未安装 PyMongo导入MongoDBOnlineStore时会抛出FeastExtrasDependencyImportError提示缺少mongodbextra见 mongodb.py。feature_store.yaml 配置详解MongoDBOnlineStoreConfig见 mongodb.py的完整配置项如下配置项类型默认值说明typeLiteral[mongodb]mongodb在线存储类型选择器固定为mongodbconnection_stringstrmongodb://localhost:27017MongoDB 连接串支持 Atlas、自建、副本集等多种形态database_namestrfeatures使用的 MongoDB 数据库名collection_suffixstrlatest集合名后缀实际集合名形如project_collection_suffixclient_kwargsDict[str, Any]{}透传给MongoClient/AsyncMongoClient的任意关键字参数vector_enabledbool继承自VectorStoreConfig是否启用 Atlas Vector Search 向量检索similaritystr继承自VectorStoreConfig向量相似度度量默认cosinevector_index_wait_timeoutint60等待新建 Atlas Search 索引变为 READY 的超时秒数vector_index_wait_poll_intervalfloat1.0轮询 Atlas Search 索引状态的间隔秒数下面给出原文档中的四类典型配置场景。1. 基础配置MongoDB Atlasproject: my_feature_repo registry: data/registry.db provider: local online_store: type: mongodb connection_string: mongodbsrv://username:passwordcluster.mongodb.net/ database_name: feast_online_storeAtlas 使用mongodbsrv://协议自动解析副本集节点适合托管部署。2. 自建 MongoDB带认证project: my_feature_repo registry: data/registry.db provider: local online_store: type: mongodb connection_string: mongodb://username:passwordlocalhost:27017/ database_name: feast_online_store collection_suffix: features注意此处把collection_suffix设为features最终集合名为my_feature_repo_features实际取项目名与后缀拼接见源码_get_collection中f{repo_config.project}_{online_config.collection_suffix}。3. MongoDB 副本集配置project: my_feature_repo registry: data/registry.db provider: local online_store: type: mongodb connection_string: mongodb://host1:27017,host2:27017,host3:27017/?replicaSetmyReplicaSet database_name: feast_online_store client_kwargs: retryWrites: true w: majority副本集模式下可通过client_kwargs指定写入关注级别write concern。retryWrites: true让 MongoDB 驱动在遇到瞬时主从切换错误时自动重试写入w: majority保证写入被多数节点确认是生产环境推荐配置。4. 高级配置自定义客户端参数project: my_feature_repo registry: data/registry.db provider: local online_store: type: mongodb connection_string: mongodbsrv://cluster.mongodb.net/ database_name: feast_online_store collection_suffix: features client_kwargs: maxPoolSize: 50 minPoolSize: 10 serverSelectionTimeoutMS: 5000 connectTimeoutMS: 10000client_kwargs中的参数会以关键字参数形式原样透传给MongoClient/AsyncMongoClient源码_get_client与_get_client_async均执行MongoClient(connection_string, driverDRIVER_METADATA, **client_kwargs)因此 PyMongo 支持的连接池、超时、TLS 等参数均可在这里配置。例如maxPoolSize控制连接池上限、serverSelectionTimeoutMS控制服务器选择超时、connectTimeoutMS控制建连超时这些参数直接影响高并发下的吞吐与容错表现。提示Feast 在创建客户端时还会传入DriverInfo(nameFeast, version...)作为驱动元数据见源码 mongodb.py便于在 MongoDB 服务端监控中识别来自 Feast 的连接。数据模型单集合 实体键聚合设计原则MongoDB 在线存储采用**每个项目一个集合single collection per project**的存储布局并将同一实体的特征按实体键聚合entity key collocation。即来自多个特征视图、面向同一实体的特征都存放在同一个文档中。这正好与 Mongo 的文档模型契合一次find即可取回该实体的全部相关特征避免多表关联查询。集合名规则为project_collection_suffix例如项目my_feature_repo、后缀features时集合为my_feature_repo_features不使用后缀时默认为project_latest。文档 Schema 示例原文档给出如下示例单个实体包含来自两个特征视图的特征——driver_stats视图的rating与trips_last7d以及pricing视图的surge_multiplier每个特征视图拥有独立的事件时间戳event timestampcreated_timestamp标记该实体的物化时间{ _id: serialized_entity_key, // Binary entity key (bytes) features: { driver_stats: { rating: 4.91, trips_last_7d: 132 }, pricing: { surge_multiplier: 1.2 } }, event_timestamps: { driver_stats: ISODate(2026-01-20T12:00:00Z), pricing: ISODate(2026-01-21T08:30:00Z) }, created_timestamp: ISODate(2026-01-21T12:00:05Z) }该 Schema 与源码中MongoDBOnlineStore的类注释完全一致mongodb.py_id为序列化后的实体键字节串features按feature_view.feature嵌套event_timestamps按特征视图记录更新时间created_timestamp为整篇文档的全局写入时间。关键设计决策_id字段使用序列化实体键bytes作为主键实现 O(1) 级别的按键查询。实体键由 Feast 的serialize_entity_key依据entity_key_serialization_version序列化见 key_encoding_utils。嵌套特征特征按特征视图名组织一个实体文档可承载多个特征视图的数据事件时间戳按特征视图分别存储追踪每个特征集合的最后更新时间支撑 point-in-time 语义创建时间戳整篇文档的全局写入时间。索引策略在线存储只依赖一个自动索引_id上的主键索引MongoDB 自动创建其值即序列化实体键。由于查询全部以_id{$in: [ids]}或向量检索索引展开在线读写无需额外创建二级索引。读写实现原理从源码看数据流写入bulk_write upsert写入入口为online_write_batch同步与online_write_batch_async异步两者共享_build_write_ops构造更新操作mongodb.py。其流程为用serialize_entity_key将实体键序列化为字节串作为_id用feast_value_type_to_python_type将每个特征的ValueProto转换为 Python 原生类型构造$set更新文档特征值写入features.feature_view.feature该视图事件时间写入event_timestamps.feature_view行级写入时间写入created_timestamp包装为UpdateOne(filter{_id: entity_id}, update..., upsertTrue)——已存在的实体文档原地更新新实体首次写入时自动创建通过collection.bulk_write(ops, orderedFalse)异步为await collection.bulk_write(...)一次性批量执行orderedFalse允许并行处理提升吞吐。集成测试 test_mongodb_online_retrieval.py 展示了完整的写入-读取回路向driver_locations、customer_profile、customer_driver_combined三个特征视图写入不同实体键的特征随后用get_online_features跨视图读取并断言结果。测试中还验证了复合实体键customer_iddriver_id与写入过其他视图但从未写入当前视图的实体返回None的边界行为。读取$in 查询 投影裁剪读取入口为online_read/online_read_asyncmongodb.py将所有实体键序列化为ids构造{_id: {$in: ids}}查询过滤投影projection只取需要的字段_id、event_timestamps.fv以及请求的特征字段features.fv.feature未指定请求特征时取整个features.fv子树——这保证了网络传输的最小化命中结果经_convert_raw_docs_to_proto转换由于 MongoDB 查询是行导向、而 Feast 的类型转换器是列导向按特征类型批量转换源码采取先按列抽取原始值、按特征批量转成ValueProto、再按行重组的两次转换策略既保持实体键顺序对齐又最小化 python/proto 转换调用次数mongodb.py。基础设施管理update 与 teardownupdate()MongoDB 是松散的惰性 Schema无需预建表结构。它只负责两件事对tables_to_delete中的特征视图执行$unset删除其features.fv与event_timestamps.fv字段当启用向量检索时为保留的特征视图创建/清理 Atlas Search 索引详见下文向量检索章节。teardown()直接clxn.drop()删除整个集合并关闭同步客户端连接mongodb.py。异步客户端通过close()释放资源。原生异步支持PyMongo AsyncMongoClientMongoDB 在线存储基于 PyMongo 4.13 的稳定版AsyncMongoClient提供原生异步能力不依赖 Motor。异步支持的能力包括高并发异步 I/O 不会受线程池限制可支撑数千级并发特征请求真正的异步非阻塞适合嵌入 FastAPI 等异步在线推理服务并发场景性能提升原文档指出相对同步顺序执行并发负载下可带来 10–20 倍的性能提升该数据为项目文档口径实际收益取决于工作负载与部署环境建议结合自身压测验证。同步与异步方法一一对应、完全对等同步异步online_readonline_read_asynconline_write_batchonline_write_batch_async类属性async_supported返回SupportedAsyncMethods(readTrue, writeTrue)显式声明读写均支持异步mongodb.py。异步客户端与同步客户端相互独立缓存_client/_collection与_client_async/_collection_async分别持有连接异步写入同样复用_build_write_ops生成UpdateOne操作再经await clxn.bulk_write(ops, orderedFalse)执行保证读写行为与同步路径完全一致。扩展能力MongoDB Atlas Vector SearchMongoDB 在线存储还支持向量检索$vectorSearch可支撑 RAG 等语义检索场景。启用方式是在配置中设置vector_enabled: true并在特征定义中为向量字段标注vector_indexTrue、vector_length、vector_search_metric。update()阶段会自动为每个 (feature_view, vector_field) 组合创建名为fv__field__vs_index的 Atlas Search 索引并通过轮询等待其变为 READYvector_index_wait_timeout/vector_index_wait_poll_interval控制等待行为索引创建是幂等的重复调用update()不会重复建索引。特征视图被删除时对应的向量索引也会被清理。检索入口retrieve_online_documents_v2使用$vectorSearch聚合阶段按余弦/欧氏等相似度返回top_k个最近文档并将向量搜索得分以distance特征返回。集成测试 test_mongodb_vector_search.py 使用mongodb/mongodb-atlas-local:8.0.4本地 Atlas 镜像验证了索引创建、写入-检索往返、top_k限制、更新幂等性与 teardown 清理等完整链路。仓库内的 RAG 示例如 examples/rag即采用此类向量检索能力构建检索增强生成应用。功能矩阵能力边界一览原文档给出了 MongoDB 在线存储相对 overview.md 功能定义的能力矩阵功能MongoDB向在线存储写入特征值yes从在线存储读取特征值yes更新在线存储基础设施如表yes销毁在线存储基础设施如表yes生成基础设施变更计划no支持 on-demand transformsyes可被 Python SDK 读取yes可被 Java 读取no可被 Go 读取no支持无实体特征视图entitylessyes支持并发写入同一键yes检索时支持 TTLtime to liveno支持删除过期数据no按特征视图聚合collocated by feature viewno按特征服务聚合collocated by feature serviceno按实体键聚合collocated by entity keyyes要点解读基础设施变更计划plan不支持与 Postgres、Redis 等表驱动存储不同MongoDB 采用集合 文档的惰性 Schemaupdate()中几乎无结构变更可言因此不生成变更计划TTL 与过期数据删除不支持目前 MongoDB 在线存储不基于特征视图 TTL 做检索过滤或物理清理需要结合应用侧或 MongoDB TTL 索引自行规划按实体键聚合这是其核心布局与单集合 文档设计一致读写语言覆盖目前仅 Python SDK 可读Java / Go 特征服务器尚不消费该存储。完整的能力对比矩阵见 overview.md。测试与本地验证仓库为 MongoDB 在线存储提供了多层测试便于本地复现验证单元/集成检索测试test_mongodb_online_retrieval.py 通过testcontainers的MongoDbContainermongo:latest内置用户名/密码认证启动容器验证多特征视图写入、跨视图读取、复合实体键与缺失特征视图返回None等行为通用在线存储测试test_universal_online.py 覆盖所有通用在线存储的公共行为契约向量检索测试test_mongodb_vector_search.py 覆盖 Atlas Vector Search 全链路测试仓库配置mongodb_repo_configuration.py 注册了 MongoDB 的IntegrationTestRepoConfig复用MongoDBOnlineStoreCreator在mongo:latest容器中建立带认证的连接串。这些测试均要求本机 Docker 可用测试内以_requires_docker跳过可用于理解连接串格式与认证场景的配置范式。总结MongoDB online store 以每项目单集合 实体键文档聚合的设计为 Feast 在线特征服务提供了一种部署灵活、扩展简单的存储选项支持 Atlas / 自建 / 副本集多形态连接client_kwargs可精细调优连接池与超时_id主键索引 投影裁剪保证按键查询高效同步/异步双通道读写支撑高并发在线推理并可通过 Atlas Vector Search 扩展语义检索能力。接入时只需在feature_store.yaml中配置type: mongodb与连接参数即可在既有特征仓库中无缝启用。【免费下载链接】feastThe Open Source Feature Store for AI/ML项目地址: https://gitcode.com/GitHub_Trending/fe/feast创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考