私は、顧客とその属性、さらにイベントの形での行動を追跡する分析システムを持っています。これは、Node.jsとMongoDB(Mongooseを使用)を使用して実装されています。MongoDBを使用したユーザセグメンテーションエンジン
ここでは、保存されたユーザーを特定の条件に基づいてセグメントにグループ化することができるセグメンテーション機能を実装する必要があります。例えば、フロントエンドでpurchases > 3 AND country = 'Netherlands'
のようなものが、これはこのようなものになります。
をここで重要な要件は、セグメントがリアルタイムで更新されていないだけで、定期的にしてしまうことがあります。これは、基本的には、ユーザーの属性が変更されるか、新しいイベントがトリガーされるたびに、どのセグメントに属しているかを再度確認する必要があります。
私の現在のアプローチは、セグメントの条件をMongoDBのクエリとして保存し、それをユーザコレクションで実行して、特定のセグメントに属するユーザを特定することです。ユーザーは、私は、彼が直接のGmailユーザーのセグメントに属していることを格納します条件に一致した場合
{
_id: '591638bf833f8c843e4fef24',
name: 'Gmail Users',
condition: {'email': { $regex : '.*gmail.*'}}
}
:Gmailのを使用しているすべてのユーザーをフィルタリングするためのセグメントは、このようになります。例えば
ユーザーのドキュメントに:
{
username: 'john.doe',
email: '[email protected]',
segments: ['591638bf833f8c843e4fef24']
}
ただし、これを行うことで、私はすべてのセグメントのためのユーザーのデータが変更されるたびに、すべてのクエリを実行しなければならないので、彼はセグメントの一部であるかどうか、私は確認することができます。これは、パフォーマンスの観点から、少し複雑で煩わしいと感じています。
これに対処する別の方法はありますか?ルールエンジンを使用し、データベースではなくアプリケーションで処理しますか?
あなたはすでにセグメントコレクションにクエリを保存していますが、そのユーザーがセグメント内にあるかどうかに影響を与えるフィールドも格納しないのはなぜですか?ユーザーのデータが変更されると、どのフィールドが変更されているかがわかります。フィールドをセグメントと比較するだけです。つまり、現在とは逆の方向に進みます。 –
btw、これは「リアルタイム」ではありません。UIにリクエストがあるたびにセグメンテーションクエリを作成するだけで、「リアルタイム」の結果を得ることができます。 –