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.