MongoDBブログに完全な回答を書きました しかし、要約すると、あなたがしなければならないことは、あなたが気にかけているものに基づいてあなたの行動を投影し、行動フィールドの値を適切なキー名にマッピングし、3つの行動を実行したときに人ごとにグループ化します(そしてオプションで何回)次に、action2がaction1の後に実行され、action3がaction2の後に実行されたかどうかを確認する新しいフィールドを投影します...最後のフェーズでは、1、1、2、または1、2、および次に3。
関数を使用して集計パイプラインを生成すると、渡されたアクションの配列に基づいて結果を生成できます。
私のテストケースでは、パイプライン全体が200ミリ秒未満で実行され、40,000のドキュメントが収集されました(これは私の小さなラップトップにありました)。
正しく指摘されたように、私が説明する一般的な解決策は、アクターがアクションを複数回実行できる一方で、アクション1からアクション2に進むことしかできないが、アクション1からアクション3に直接スキップすることはできないことを前提としています( action2を実行するまで、action3を実行することはできません。
結局のところ、集約フレームワークは、順序が完全に任意であるイベントのシーケンスにも使用できますが、ある時点でシーケンスaction1、action2、action3を実行した人の数を知りたい場合もあります。
元の答えに対して行う主な調整は、中央に2段階のステップを追加することです。この手順では、収集された個人ドキュメントを解凍して再グループ化し、後に続く2番目のアクションの最初の発生を見つけます。 最初のアクションの最初の発生。
最終的な比較がaction1になり、次にaction2が最も早く発生し、それをaction3の最新の発生と比較します。
おそらく、任意の数のイベントを処理するように一般化できますが、2つを超えるイベントが追加されるたびに、集計にさらに2つのステージが追加されます。
これが