2013-04-13 14 views
10

Stworzyłem czat z tylko 1 pokojem, wiadomościami prywatnymi, moderacją i wszystkim teraz i wszystko działa świetnie! Podczas testowania czatu zdałem sobie sprawę, że wszystkie wiadomości zapisane na czacie zostały zapisane, a jeśli korzystałeś z czatu przez wiele osób, bardzo szybko zajęłoby to dużo miejsca w bazie Firebase.Czat Firebase - usuwanie starych wiadomości

Aby dać przykład tego, co szukam, pozwól mi pokazać, jak sobie radzić w wiadomości:

Kiedy John wysyła prywatną wiadomość do Boba, wiadomość zostanie dodany zarówno do Jana i listy Bobs prywatnych wiadomości, tak:

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

jest to przykład tego, jak będzie wyglądać z Firebase 2 wiadomości na czacie i 2 prywatne wiadomości:

{ 
    "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", 
     } 
    } 
    } 
} 

i to samo dzieje się na odwrót. Teraz, jeśli Bob ma się rozłączyć, lista prywatnych wiadomości od Bobsa zostaje usunięta, ale John nadal widzi swoją rozmowę z Bobem, ponieważ dostał kopię wszystkich wiadomości na swojej liście. Jeśli John rozłączy się po Bobie, baza Firebase zostanie wyczyszczona, a rozmowa nie będzie już przechowywana.

Czy istnieje sposób na osiągnięcie czegoś takiego przy czacie ogólnym? Przesyłanie wiadomości do wszystkich użytkowników korzystających z czatu nie wydaje się dobrym rozwiązaniem (?). Czy może w jakiś sposób sprawić, że Firebase będzie przechowywać tylko 100 najnowszych wiadomości?

Mam nadzieję, że to ma sens!

Z pozdrowieniami

Ps. Wielkie dzięki dla zespołu Firebase za wszelką pomoc, naprawdę to doceniam.

+0

Czy możesz podzielić się zapytaniem o uzyskanie listy prywatnych wiadomości czatu między testem a Test2 i zamówić je z czasem? – Nikhil

Odpowiedz

18

Istnieje kilka różnych sposobów rozwiązania tego problemu, niektóre bardziej skomplikowane w implementacji niż inne. Najprostszym rozwiązaniem byłoby mieć każdy użytkownik czytać najnowsze wiadomości: 100

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

Twoja lista wiadomości będą nadal zawierają wszystkie wiadomości, ale to nie wpłynie na wydajność, ponieważ każdy klient prosi tylko przez ostatnie 100 wiadomości . Ponadto, jeśli chcesz wyczyścić stare dane, najlepiej ustawić priorytet każdej wiadomości jako znacznik czasu, kiedy wiadomość została wysłana. Następnie usuń wszystkie wiadomości starsze niż 2 dni, używając:

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

Mam nadzieję, że to pomoże!

+0

Ahh Rozumiem, w porządku, zrobię to dzisiaj i dam ci znać, jak się okazuje - wielkie dzięki! – MrE

+0

Hi Anant, Kod działa w JS, ale czy jest to możliwe za pośrednictwem interfejsu API REST? Usunąć wiadomości na podstawie priorytetu? Zaznaczę to dzisiaj, tak jak robi to, co jest wymagane, jeśli używamy JS. – MrE

+2

Jest to możliwe, ale wymaga wielu kroków. Najpierw należy pobrać dane z priorytetami - można to zrobić, dodając parametr GET "format = export". Obejmuje to prirority każdego obiektu w specjalnym kluczu ".priority" (zobacz https://www.firebase.com/docs/rest-api.html). Następnie można posortować obiekt według priorytetu na poziomie lokalnym, a następnie wysłać żądania DELETE dla wszystkich obiektów, które chcesz usunąć. – Anant

Powiązane problemy