MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Mô hình tin nhắn trò chuyện riêng của Mongoose

Chà, không có câu trả lời chính xác cho câu hỏi này, Nhưng chắc chắn, các cách tiếp cận bạn đã đề cập không phải là tốt nhất!

Trước tiên, khi bạn đang nghĩ đến việc thiết kế mô hình "trò chuyện", bạn cần tính đến việc sẽ có hàng triệu tin nhắn giữa những người dùng, vì vậy bạn cần quan tâm đến hiệu suất khi bạn muốn tìm nạp các cuộc trò chuyện.

Lưu trữ các thông báo vào một mảng hoàn toàn không phải là một ý tưởng hay, kích thước mô hình của bạn sẽ lớn theo thời gian và bạn phải cân nhắc rằng giới hạn kích thước tài liệu của MongoDB hiện là 16 MB cho mỗi tài liệu.

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

Thứ hai, bạn phải xem xét khía cạnh phân trang vì nó sẽ ảnh hưởng đến hiệu suất khi trò chuyện lớn, khi bạn truy xuất trò chuyện giữa 2 người dùng, bạn sẽ không yêu cầu tất cả các cuộc trò chuyện kể từ đầu, bạn sẽ chỉ yêu cầu những cái gần đây nhất và sau đó bạn có thể yêu cầu những cái cũ hơn nếu người dùng cuộn cuộc trò chuyện, khía cạnh này rất quan trọng và không thể bỏ qua do ảnh hưởng của nó đến hiệu suất.

Cách tiếp cận của tôi sẽ là lưu trữ từng thư trong một tài liệu riêng biệt

Trước hết, việc lưu trữ từng thư trong một tài liệu sẽ tăng hiệu suất của bạn trong quá trình tìm nạp các cuộc trò chuyện và kích thước tài liệu sẽ rất nhỏ.

Đây là một ví dụ rất đơn giản, bạn cần thay đổi mô hình theo nhu cầu của mình, nó chỉ là đại diện cho ý tưởng:

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
});

bạn có thể tìm nạp các cuộc trò chuyện bằng truy vấn này:

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

Dễ dàng và sạch sẽ! Như bạn thấy, việc phân trang trở nên rất dễ dàng với cách tiếp cận này.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Giám sát &Bảo mật MongoDB với Cố vấn ClusterControl

  2. Các giao dịch MongoDB trải dài trên nhiều yêu cầu web

  3. $ Min của MongoDB là gì? Điều đó khác với find (). Sort ({the_field:1}). Limit (1) như thế nào?

  4. Cách định dạng ngày trong MongoDB

  5. Tại sao và khi nào cần thiết phải xây dựng lại các chỉ mục trong MongoDB?