sql >> データベース >  >> NoSQL >> MongoDB

マングースプライベートチャットメッセージモデル

    ええと、この質問に対する正しい答えはありませんが、確かに、あなたが言及したアプローチはまったく最善ではありません!

    まず、「チャット」モデルの設計を検討するときは、ユーザー間に何百万ものメッセージが存在することを考慮する必要があるため、チャットを取得するときはパフォーマンスに注意する必要があります。

    メッセージを配列に格納することはまったく良い考えではありません。モデルのサイズは時間の経過とともに大きくなり、MongoDBのドキュメントサイズの制限は現在ドキュメントあたり16MBであることを考慮する必要があります。

    https://docs.mongodb.com/manual/reference/limits/

    次に、チャットが大きい場合はパフォーマンスに影響するため、ページネーションの側面を考慮する必要があります。2人のユーザー間のチャットを取得する場合、時間の初めからすべてのチャットを要求するのではなく、要求するだけです。最新のもの、そしてユーザーがチャットをスクロールした場合は古いものをリクエストできます。この側面は非常に重要であり、パフォーマンスへの影響のために無視することはできません。

    私のアプローチは、各メッセージを個別のドキュメントに保存することです

    まず、各メッセージを1つのドキュメントに保存すると、チャットの取得時のパフォーマンスが向上し、ドキュメントのサイズが非常に小さくなります。

    これは非常に単純な例です。必要に応じてモデルを変更する必要があります。これは、アイデアを表すためだけのものです。

    const MessageSchema = mongoose.Schema({
        message:{
            text: { type:String, required:true }
            // you can add any other properties to the message here.
            // for example, the message can be an image ! so you need to tweak this a little
        }
        // if you want to make a group chat, you can have more than 2 users in this array
        users:[{
            user: { type:mongoose.Schema.Types.ObjectId, ref:'User', required:true }
        }]
        sender: { type:mongoose.Schema.Types.ObjectId, ref:'User', required:true },
        read: { type:Date }
    },
    {
        timestamps: true
    });
    

    次のクエリでチャットを取得できます:

     Message.find(({ users: { "$in" : [#user1#,#user2#]} })
        .sort({ updatedAt: -1 })
        .limit(20)
    

    簡単でクリーン!ご覧のとおり、このアプローチを使用するとページネーションが非常に簡単になります。



    1. MongoDB $ mergeObjects

    2. node.jsアプリのMongoIDに基づいてMongoDBをクエリする

    3. spark-submitを介して追加のjarファイルをSparkに渡す

    4. テキスト検索で結果がないMongoDBPHP