2013-04-13 39 views
10

Tôi đã tạo một cuộc trò chuyện chỉ với 1 phòng, tin nhắn riêng tư, kiểm duyệt và mọi thứ ngay bây giờ và tất cả đều hoạt động tuyệt vời! Trong khi tôi đang thử trò chuyện, tôi nhận ra rằng tất cả các tin nhắn được gõ trong cuộc trò chuyện đã được lưu và nếu bạn có nhiều người sử dụng trò chuyện, nó sẽ chiếm rất nhiều không gian trong Firebase của bạn.Trò chuyện Firebase - xóa các tin nhắn cũ

Để cung cấp cho bạn một ví dụ về những gì tôi đang tìm kiếm, hãy để tôi chỉ cho bạn cách tôi xử lý các thông điệp tin:

Khi John gửi một thông điệp tới Bob, thông điệp sẽ được thêm vào cả John và danh sách Bobs các thông điệp riêng, như thế này:

/private/John <-- Message appended here 
/private/Bob <-- Message appended here 

Đây là một ví dụ về cách các căn cứ hỏa lực sẽ nhìn với 2 tin nhắn trong chat, và 2 tin nhắn:

{ 
    "chat" : { 
    "516993ddeea4f" : { 
     "string" : "Some message here", 
     "time" : "Sat 13th - 18:20:29", 
     "username" : "test", 
    }, 
    "516993e241d1c" : { 
     "string" : "another message here", 
     "time" : "Sat 13th - 18:20:34", 
     "username" : "Test2", 
    } 
    }, 
    "private" : { 
    "test" : { 
     "516993f1dff57" : { 
     "string" : "Test PM reply!", 
     "time" : "Sat 13th - 18:20:49", 
     "username" : "Test2", 
     }, 
     "516993eb4ec59" : { 
     "string" : "Test private message!", 
     "time" : "Sat 13th - 18:20:43", 
     "username" : "test", 
     } 
    }, 
    "Test2" : { 
     "516993f26dbe4" : { 
     "string" : "Test PM reply!", 
     "time" : "Sat 13th - 18:20:50", 
     "username" : "Test2", 
     }, 
     "516993eab8a55" : { 
     "string" : "Test private message!", 
     "time" : "Sat 13th - 18:20:42", 
     "username" : "test", 
     } 
    } 
    } 
} 

và cùng đi theo cách khác. Bây giờ nếu Bob ở đâu để ngắt kết nối, danh sách thư cá nhân của Bob sẽ bị xóa, nhưng John vẫn có thể xem cuộc trò chuyện của anh ấy với Bob vì anh ấy có một bản sao của tất cả các thư trong danh sách của anh ấy. Nếu sau đó John ngắt kết nối sau Bob, Firebase sẽ được làm sạch và cuộc hội thoại của họ không còn được lưu trữ nữa.

Có cách nào để đạt được điều gì đó như thế này với trò chuyện chung không? Việc đẩy thư đến tất cả người dùng đang sử dụng trò chuyện dường như không phải là giải pháp tốt (?). Hoặc là nó có thể bằng cách nào đó làm cho Firebase chỉ giữ 100 tin nhắn mới nhất chẳng hạn?

Tôi hy vọng điều đó có ý nghĩa!

Trân trọng

Ps. Cảm ơn rất nhiều vì nhóm Firebase đã giúp tôi rất nhiều, tôi thực sự đánh giá cao điều đó.

+0

Bạn có thể chia sẻ truy vấn để nhận danh sách các tin nhắn trò chuyện riêng tư giữa kiểm tra và Test2 và sắp xếp chúng theo thời gian không? – Nikhil

Trả lời

18

Có một vài cách khác nhau để giải quyết vấn đề này, một số cách phức tạp hơn để thực hiện so với các cách khác. Giải pháp đơn giản nhất sẽ có mỗi người dùng chỉ đọc 100 tin nhắn mới nhất:

var messagesRef = new Firebase("https://<example>.firebaseio.com/message").limit(100); 
messagesRef.on("child_added", function(snap) { 
    // render new chat message. 
}); 
messagesRef.on("child_removed", function(snap) { 
    // optionally remove this chat message from DOM 
    // if you only want last 100 messages displayed. 
}); 

danh sách các thông điệp của bạn vẫn sẽ chứa tất cả các thư nhưng nó sẽ không ảnh hưởng đến hiệu suất vì mỗi khách hàng chỉ được hỏi cho 100 tin nhắn cuối cùng . Ngoài ra, nếu bạn muốn xóa dữ liệu cũ, tốt nhất là đặt mức độ ưu tiên cho mỗi thư làm dấu thời gian khi thư được gửi. Sau đó, bạn xóa tất cả các thư cũ hơn 2 ngày với:

var timestamp = new Date(); 
timestamp.setDate(timestamp.getDate()-2); 
messagesRef.endAt(timestamp).on("child_added", function(snap) { 
    snap.ref().remove(); 
}); 

Hy vọng điều này sẽ hữu ích!

+0

Ahh Tôi hiểu rồi, được rồi, hôm nay tôi sẽ cho nó một sự thay đổi và cho bạn biết cách nó diễn ra - cảm ơn rất nhiều! – MrE

+0

Hi Anant, Mã hoạt động trong JS, tuy nhiên điều này có thể thực hiện được thông qua REST API không? Xóa thư dựa trên mức độ ưu tiên? Tôi sẽ đánh dấu điều này ngày hôm nay, vì nó làm những gì được yêu cầu nếu sử dụng JS. – MrE

+2

Có thể, nhưng yêu cầu nhiều bước. Trước tiên, bạn cần truy xuất dữ liệu có mức độ ưu tiên - bạn có thể thực hiện việc này bằng cách thêm tham số GET "format = export". Điều này sẽ bao gồm sự xuất hiện của mọi đối tượng trong một khóa "đặc quyền" đặc biệt (xem https://www.firebase.com/docs/rest-api.html). Sau đó, bạn có thể sắp xếp đối tượng theo mức độ ưu tiên cục bộ và sau đó phát hành các yêu cầu DELETE cho tất cả các đối tượng bạn muốn xóa. – Anant

Các vấn đề liên quan