AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。
Docs Menu

MongoDBと Feast の統合

Feast は高レベルの FeatureStore APIを提供しており、機能と機能のグループ(機能ビュー)、オンライン ストレージとオフラインストレージを定義し、オフラインからオンラインストレージにデータを動的に移動する能力(マテリアライズド)を定義できます。MongoDB統合により、MongoDB をFeast のオンラインオフラインの両方のストアとして使用できるため、個別のストレージシステムを維持することなく、機能を一度定義して、モデル訓練やオンライン推論で一貫して提供できます。

MongoDB の柔軟な document model とMQLにより、オフライン ストアに必要な複雑なクエリ パターンを処理できます。オンライン ストアでは、 MongoDBはウェブスケールのアクセス パターン(高速読み取り/書込み、水平スケーリング、結合やラウンド トリップを最小限に抑える柔軟なスキーマ)に最適化されています。

この統合の概要では、次の項目が見つかります。

  • Feast のオンラインおよびオフライン ストアとしてのMongoDBの紹介。

  • Feast の概念がMongoDBにどのようにマッピングされるか。

  • MongoDB のオフラインとオンライン ストアのデザインの詳細な説明。

  • Feast にMongoDBストアを設定するための構成例。

  • オンライン ストアは、オンライン推論中にエンティティごとの最新機能を低レイテンシで取得するために最適化された、単一のMongoDBコレクション を基盤としたキーと値のストアです。

  • オフライン ストアは、**datasets**の**訓練**、スコアリング、マテリアライズド(**オンライン**ストアにデータを推奨)するために、 **MongoDB** **コレクション**(通常は feature_history と呼ばれる)に保存されている履歴**機能**データの行を**クエリ**するレイヤーィングおよび翻訳レイヤーです。

一般的なエンドツーエンドのワークフローは次のようになります。

  1. MongoDBベースのコレクションを点エンティティ、機能ビュー、データソースを定義します。

  2. offline_write_batch 経由で機能データをオフライン ストアに取り込みます。PyArrow テーブルを input として受け入れ、オフライン ストアスキーマに従って feature_history MongoDBコレクションにデータを挿入します。

  3. get_historical_features を使用して訓練データを生成します。これにより、 MongoDBに保存されている履歴機能行に対して効率的なポイントインタイム結合が実行されます。

  4. pull_latest_from_table_or_queryonline_write_batch を使用して、オフライン ストアの最新の機能値をオンライン ストアに具体化します。

  5. Feast のオンライン API 経由で機能をオンラインで提供します。この API は、シリアル化されたエンティティ キーでキー付けされた単一のMongoDBコレクションから読み取ります。

MongoDB の統合は Feast の標準概念modelに従いますが、それらの抽象化をエンティティ中心のオンライン documentと追加のみの履歴イベント用に設計されたMongoDBスキーマにマッピングします。

フィーストの概念
Feast でのロール
MongoDB表現

エンティティ

説明する機能を持つドメインオブジェクト(例:ドライバー、ユーザー)。

シリアル化されたエンティティキーにエンコードされます。オンライン ストアでは _id として保存され、オフライン ストアでは entity_id として保存されます。

結合キー

データフレーム内のエンティティ行を識別するために使用される列。

serialize_entity_key に準拠しました。結果のバイトは、 MongoDBのエンティティ識別子として使用されます。

直列化された EntityKey

結合キー名と値の決定的なbinaryエンコーディング。

オンライン: _id: serialized_entity_key(プライマリキー)。オフライン: feature_history document の entity_id: Binary(...)フィールド。

機能

特定の点における型指定された測定値。

features サブドキュメント(オフライン)または features.<feature_view>.<feature_name>(オンライン)内のフィールド。

FeatureView

機能をエンティティ、データソース、 TTL にバインドします。組織の単位。

オフライン: 各履歴 document の feature_view 弁別子 string。オンライン: features.<feature_view>event_timestamps の FV ごとのタイムスタンプにネストされたグループ。

DataSource

履歴機能が存在する場所へのメタデータ ポインター。

MongoDBSource MongoDBコレクション(databasecollectionconnection_string)とタイムスタンプを指定します。

OFFlineStore

履歴機能と PIT 結合用の読み取り/書込みインターフェース。

MongoDBOfflineStore 複合インデックスを使用して共有 feature_historyコレクションに対してMQL集計を実行中実装。

OnlineStore

エンティティごとの最新機能値の低レイテンシ ストア。

ネストされた featuresevent_timestamps サブドキュメントを持つ、_id = serialized_entity_key によってキーされるエンティティ document の単一のMongoDBコレクション。

TTL

FeatureView レベルの リフレッシュウィンドウ。

履歴機能を計算するときにオフライン クエリとPython後フィルタリングで強制されます。は、インデックスの created_timestamp または updated_at と組み合わせることもできます。

FeatureService

modelの機能参照の名前付きリスト。

MongoDB の直接表現ではありません。 Feast は、オンライン ストアから読み取る features.<feature_view>.<feature_name> パスを決定するために使用します。

レジストリ

エンティティ、機能ビュー、サービスのメタデータ ストア。

変更されていない。 MongoDB統合は Feast レジストリを置き換えるものではありません。

RetrievalJob

機能テーブルを返す延期された実行ラッパー。

MongoDBオフライン ストアの場合、 はMQL集計をカプセル化し、カーソルから Arrow への変換を基盤とした Arrow のエクスポートを公開します。

マテリアライズド

最新のオフライン機能をオンライン ストアに提供する予定です。

feature_history 経由で pull_latest_from_table_or_query 経由で実装し、その後 online_write_batch をオンラインMongoDBコレクションに実装します。

MongoDBオフライン ストアは、すべての機能ビューに対する追加のみの履歴機能行を保存する単一の共有コレクション(デフォルトでは feature_history)を使用します。

各documentは、特定のイベントタイムスタンプにおける 1 つの FeatureView の 1 つのエンティティの 1 つの観察を表します。

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

主なプロパティ:

  • 追加のみ: 履歴データは不変として扱われます。修正は、インプレース 更新ではなく、新しい created_at タイムスタンプを持つ新しい行として書き込まれます。

  • 時系列に適しています: event_timestamp は機能値が観察された時間を表します。 created_at は、複数の観察が同じイベントタイムスタンプを共有する場合に、タイブレークとして使用されます。

  • FeatureView による機能グループ化: feature_view は行が属する FeatureView を識別するため、単一のコレクションで複数の FV をホストできます。

単一の複合インデックスで、すべての主要クエリ パターンがサポートされます。

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

このインデックス、エンティティや機能集計に対する効率的な範囲スキャンが可能になると同時に、(entity_id, feature_view) ごとの最新の観察が最初に認識されるようになります。

複合インデックスがオフライン ストアによって発行された各クエリをどのように処理するか。

クエリ パターン
インデックスの動作

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

(entity_id, feature_view) プレフィックスのインデックス範囲スキャン。

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

ソートは一切操作されません。つまり、インデックス順がソート順と一致します。

$group $first

カーソルは最初に (entity_id, feature_view) ごとの最新 document を参照します。 $group $first は、それをすぐに選択します。

pull_latest_from_table_or_query

$match { feature_view } + $group $first by entity_id(entity_id, feature_view) の部分的なプレフィックススキャン

このインデックスがない場合、4 つのクエリ パターンはすべて COLLSCAN に降格します。インデックスは _ensure_indexes 経由で最初の使用時に遅延して作成され、プロセスレベルの _indexes_ensured セットの接続文字列ごとにキャッシュされるため、プロセス有効期間ごとに 1 回だけ作成されます。

MongoDBオフライン ストアは、標準の Feast オフライン ストア インターフェイスを実装します。

  • offline_write_batch - 構成された MongoDBSourceメタデータを使用して、connection_stringdatabasecollection を決定し、基礎のMongoDBコレクションに機能データの pyarrow.Table を書き込みます。

  • get_historical_features - エンティティとイベントタイムスタンプの entity_df と FeatureView のセットを指定すると、 は、各行に特定の時点の正しい機能値が含まれる拡大テーブルを返します。それぞれの (entity_id, event_timestamp) ペアについて、event_timestamp <= entity_event_timestamp を持つ最新の機能値TTL 内の と が選択されます。

  • pull_latest_from_table_or_query - オンライン ストアをシードするために Feast のマテリアライズドエンジンによって使用される 時間ウィンドウの最新の機能値を含むエンティティごとに 1 行を返します。

  • pull_all_from_table_or_query - 同じ feature_historyスキーマとインデックスに基づき、エクスポートまたは検査のために指定された日付範囲内のすべての行をデータソースから取得します。

  • persistRetrievalJob.persist経由)- 履歴機能クエリの結果を、SavedDatasetStorage経由で別のコレクションまたは外部シンクに書き込みます。feature_history とは異なります。

追加専用の書込みセマンティクス、バッチ作成、競合の解決。

呼び出しパス:

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)

追加のみのセマンティクス: 10,000documentバッチに insert_many(ordered=False) を使用してdocumentが挿入されます。書き込み時にアップサートや重複除外は行われません。同じ (entity_id, feature_view, event_timestamp) ペアの複数の document が許可され、保持されます。

競合の解決は読み取り時間まで延期されます。

  • pull_latest_from_table_or_query は、選出された event_timestamp グループ内で最も高い created_at を持つdocumentを選択します。

  • get_historical_features (スコアリング パス)は $sort … created_at DESC を使用するため、タイムスタンプが同点になった場合には $group $first も最高の created_at を選択します。

したがって、後の created_at を使用して書き込まれた修正は、削除または更新操作なしで選出されます。

最新機能検索に使用される完全集計ステージ。

pull_latest_from_table_or_query は、 [start_date, end_date]ウィンドウ内の最新の機能値を含むエンティティごとに 1 行を返します。entity_df が提供されていません。

パイプライン ステージ:

$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.* }

複合インデックスは$match + $sort を効率的に処理します。 $group $first は、残りをマテリアライズドせずにエンティティごとに 1 つのdocumentを選択します。

推奨されるオフライン実装は、MongoDBOfflineStore という名前の集計ベースのMongoDBオフライン ストアです。

主な特徴:

  • すべての FeatureView で共有される単一の feature_historyコレクションを使用します(feature_view で区別されます)。

  • すべてのクエリで複合インデックス(entity_id, feature_view, event_timestamp, created_at) に依存し、コレクションのフル スキャンを回避します。

  • 「スコアリング」ワークロード(エンティティごとに 1 行)にはサーバーサイドの $group $first を使用し、エンティティ ID が繰り返されるワークロードを「訓練」するには pd.merge_asof を使用し、正確性とパフォーマンスのバランスをとります。

  • チャンク化によるメモリ使用量の限界が設定されているため、 RAM を枯渇することなく、大きな entity_df 値を処理できます。

ベンチマークは、この実装が代替のMongoDBオフライン アプローチと比較して、スループットとメモリ効率の最高の組み合わせを提供することを示しています。

点インタイム結合、スコアリング パスと訓練 パス、および正確性のトレードオフ。

get_historical_features は、コア Feast APIです。entity_df(エンティティ キー列の N 行 + event_timestamps)および K FeatureView オブジェクトを受け入れ、同じ N 行と M の機能列を含む DataFrame を返します。値は各行の event_timestamp(点-時間枠の正確性)。

表記:

  • N → エンティティ数

  • M → 機能数

  • P → 観察数

  • F → 機能ビュー数

  • K → 1 回の get_historical_features 呼び出しでリクエストされた機能ビューの数

スコアリング パス

スコアリング パスは、entity_df に繰り返されるエンティティ ID がない場合にアクティブ化されます。これは、各行が異なるタイムポイントで個別のエンティティの機能を要求する一般的な推論シナリオです。

検出:

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

スコアリング時に、サーバー側の $group $first ステージが追加されます。

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

$group(entity_id, feature_view) でグループ化し、最も高い (event_timestamp, created_at) を持つ document を選択します。つまり、先行する $sort の後のインデックス順 の最初の document です。MongoDB は、機能ビューごとに各エンティティの他の P-1 document を具体化することはありません。カーソルは、1 つの document を選択した後、単純に次のグループ キーに進みます。エンティティあたりのコストは O(P) ではなく、O(ログ P)(インデックス検索)です。

$matchevent_timestamp: {$lte: max_ts} を使用します。max_ts は現在のチャンク内の最大エンティティリクエストタイムスタンプです。これは控えめな近似値(「オーバーシューティング」)です。サーバーは一部のエンティティについて、若干将来にdocumentを返す場合があります。以下のPython後フィルターは、無効な行を null で除外することで、これを修正します。

# 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

これは、単一の pd.merge 呼び出しとそれに続くベクトル化されたブール値インデックスの作成です。O(N) は Panas Cコードで、P と M とは独立して動作します。

訓練パス

entity_df に繰り返しのエンティティ ID がある場合(エンティティごとに多数のタイムスタンプ スナップショットを持つ訓練 datasets)、$group ステージは省略されます。この集計では、各エンティティのタイムスタンプウィンドウ内のすべてのdocumentが返されます。Pythonはpd.merge_asof を使用して各行の event_timestamp またはその前に最新のdocumentを見つけます。

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

大規模なdatasetsのメモリ使用量を制御するための 2 レベルのチャンク。

メモリ使用量を制御するチャンクの 2 つのレベル

レベル
定数
目的

外側 CHUNK_SIZE

50,000 行

_run_single に渡される entity_df スライスを制限します。は、 Pythonのピーク結果 Data Frame を上限とします。

内部 MONGO_BATCH_SIZE

10,000 エンティティ ID

集計呼び出しごとに {$in: [...]} 配列のサイズを制限します。は、肥大化したBSONメッセージを回避します。

entity_dfCHUNK_SIZE より大きい場合、外側のループは複数の _run_single 呼び出しを実行し、結果を連結します。

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)

したがって、合計 N に関係なく、Python 側のピークメモリは O(CHUNK_SIZE x M x K) になります。

MongoDBサブドキュメントから DataFrame 列に機能を抽出します。

MongoDB features サブドキュメントは、pd.json_normalize ではなく pd.apply を使用して個々の列に展開されます。これにより、json_normalize はフラット化または失敗する複雑な型(マップと構造体の決定、配列のリスト)が保持されます。プロジェクションされた列名が 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"])
機能
サポートされていますか?
ノート

get_historical_features (PIT 結合)

はい

インデックス付き集計と Ppanda のマージを使用して MongoDBOfflineStore 経由で実装されています。

pull_latest_from_table_or_query

はい

(entity_id, feature_view, event_timestamp, created_at) よりも $match + $sort + $group $first を使用します。

pull_all_from_table_or_query

はい

feature_history を超える時間フィルターを使用した完全履歴スキャン。

offline_write_batch

はい

構成された MongoDBSource を介してMongoDBに Arrow テーブルを書込みます。

persist

はい

SavedDatasetStorage を使用して履歴クエリ結果を別のコレクションにエクスポートします。

データレイクや倉庫に直接エクスポートするような追加のオプションは、特定の RetrievalJob実装によって異なります。また、オフライン ストアでは、Feast の標準パターンに従うことが予想されます。

MongoDBオンライン ストアでは、シリアル化されたエンティティ キーをキーとするすべての FeatureView に対して単一のコレクションが使用されます。

  • _id: serialized_entity_key(entity_key)。エンティティ名と値をソートしてバイトにエンコードする Feast の安定エンコーディング関数によって生成されます。

  • features: 各 FeatureView が独自の機能名前空間を維持するネストされたサブドキュメント。

  • event_timestamps: その FeatureView の最新値がいつ書き込まれたかを示す FeatureView ごとのタイムスタンプ。

  • created_timestamp または updated_at: TTL インデックスと診断に便利なブックキーピング フィールド。

例(簡略化):

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

設計理由:

  • 単一のコレクションは各エンティティの「状態」を 1 つのdocumentで保持するため、キーベースの検索に関する Feast の予想と一致し、FeatureView ごとのコレクション間での状態の断片化を回避します。

  • シリアル化されたエンティティキーを _id として使用すると、Feast の決定的エンコーディングが再利用され、コレクション間で重複するプライマリキーが回避され、エンティティごとに単一のキー検索が取得されます。

オンライン ストアとオフライン ストア スキーマの両方の詳細な設計理由。

オフライン ストア(feature_view 弁別子フィールドを持つ単一の feature_historyコレクションを使用するもの)と同様に、オンライン ストアもすべての FeatureView に対して単一のコレクションを使用します。

Atlas オンライン Store は基本的にエンティティキー向けであり、機能ビュー向けではありません。高レベルの FeatureStore API は1 つの FeatureView を使用して online_readonline_write_batch を呼び出しますが、Feast の基礎のストレージmodelは、エンティティ キーごとに 1 つの論理行を対象に設計されています。その行には、時間の経過とともに複数の FeatureView からの機能が蓄積される可能性があります。

1 つのコレクションを使用すると、エンティティごとに統合された document を維持し、コレクション間でエンティティキーを重複させることなく、関連するサブドキュメント(例: features.<feature_view_name>)のみを不可分的に更新できます。

単一コレクションのデザインは最初から Feast の標準であり(最初は Reds 用に設計されています)、MongoDB の強度に適しています。メリットには、次のようなものがあります。

  • 書込み保証 (write concern) の削減

  • 簡素化されたインデックス管理(プライマリ _idインデックスは1 つだけ)

  • 複数の FeatureView が同じエンティティを共有する場合、コレクション間の調整は行われません

  • Feast のキーベースのフェッチmodelによるコンシステントな検索model

Feature-View ごとのコレクション設計では、エンティティの状態がフラグメント化され、機能が構成されている場合は追加の調整や複数のコレクション クエリが必要になり、Feast のアクセス パターンのパフォーマンス上の利点なしに運用オーバーヘッドが増加します。

直列化されたエンティティキーとして _id: Feast は、予測可能なバイトシーケンス(バイトを生成する struct.pack で型指定)を確保するために、連結する前にエンティティ名と値を明示的にソートする安定したエンコーディング関数である serialize_entity_key を提供します。つまり、_id として直接使用できます。

注意

serialize_entity_key は安定した _id を提供しますが、その出力は均等に分散されていないため、シャーディングには理想的ではありません。配置でオンライン ストアのコレクション をシャーディング必要がある場合は、ハッシュされたシャードキーまたは追加のフィールドを検討してください。

MongoDBオンライン ストアには、Feast の標準オンライン ストアAPIが実装されています。

  • online_write_batch - マテリアライズ中に、Feast は各エンティティの最新の機能値をMongoDB documentに書き込みます。各バッチするアップサートでは、関連するネストされた features.<feature_view> サブdocumentと、event_timestamps 内の対応するエントリのみが更新され、エンティティ documentはアトミックでコンシステントに保たれます。

  • online_readget_online_features - オンラインで提供すると、オフラインと同じ直列化ロジックを使用してエンティティキーを _id 値に解決し、キー検索を実行します。各検索は、ネストされた features 構造を活用して、エンティティに要求された機能を 1 回のラウンド トリップですべて返します。

  • TTL と最新性 - 機能 TTL は FeatureView で構成され、主にオンラインの PIT 結合で使用されます。オンライン TTL は、updated_at または同様のタイムスタンプのインデックスを使用して実装できます。これは、オンライン ストアが最新の状態を保持している間は、オフライン ストアは追加専用であるという Feast の概念とコンシステントです。

オフライン ストアは MongoDBOfflineStoreConfig を使用して構成されています。

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

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 は、対応する DataSource です。Its nameフィールドは、すべてのdocumentに保存される feature_view 弁別子になります。完全な構成オプションについては、Feast ドキュメントのMongoDB データソース参照を参照してください。

source = MongoDBSource(
name="driver_stats",
timestamp_field="event_timestamp",
created_timestamp_column="created_at",
)