2013-04-13 87 views
10

我创建了一个聊天室,只有一个房间,私人信息,审核和所有内容,现在一切都很顺利! 当我测试聊天时,我意识到聊天中输入的所有消息都会被保存,如果您有很多人使用聊天功能,它很快就会在您的Firebase中占用相当多的空间。Firebase聊天室 - 删除旧信息

为了给你什么,我期待的一个例子,让我告诉你我是如何处理私人邮件:

当约翰·发送悄悄话给Bob,该消息将被添加到约翰和鲍勃名单都私人信息,像这样的:

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

这是的火力点是什么样子,在聊天2消息,和2个私人信息的例子:

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

,反过来也是如此。现在,如果鲍勃在哪里断开连接,Bob的私人消息列表被删除,但约翰仍然能够看到他与鲍勃的对话,因为他得到了他名单上所有消息的副本。如果John在Bob之后断开连接,Firebase将被清除并且不再存储他们的对话。

有没有办法用普通聊天来实现这样的事情? 向所有使用聊天的用户推送消息似乎不是一个好的解决方案(?)。或者是否有可能以某种方式让Firebase仅保留最新的100条消息?

我希望它是有道理的!

亲切的问候

Ps。非常感谢Firebase团队的所有帮助,我非常感谢。

+0

你可以请分享查询以获得测试和测试2之间的私人聊天消息列表,并与时间订购? – Nikhil

回答

18

有几种不同的方法来解决这个问题,比其他方法更复杂。最简单的解决办法是让每个用户只能阅读最新的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. 
}); 

您的邮件列表仍将包含的所有消息,但它不会影响性能,因为每个客户只要求最后100条消息。另外,如果要清理旧数据,最好将每条消息的优先级设置为发送消息的时间戳。然后,您删除所有超过2天的消息:

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

希望这有助于!

+0

啊,我明白了,好吧,我今天会给它一个摆动,让你知道它是如何结果 - 非常感谢! – MrE

+0

嗨Anant, 该代码在JS中工作,但是这可能通过REST API?根据优先级删除消息?我今天会标记这一点,因为如果使用JS,它会做这些事情。 – MrE

+2

这是可能的,但需要多个步骤。 首先,您需要检索具有优先级的数据 - 您可以通过添加GET参数“format = export”来执行此操作。这将包括每个对象在特殊“.priority”键中的优先权(请参阅https://www.firebase.com/docs/rest-api.html)。 然后,您可以按照本地优先级排序对象,然后为要删除的所有对象发出DELETE请求。 – Anant