Javascript 聊天应用程序如何生成特定聊天的id?

Javascript 聊天应用程序如何生成特定聊天的id?,javascript,node.js,mongodb,chat,Javascript,Node.js,Mongodb,Chat,假设我有两个用户,“马特”和“凯文”。马特想给凯文发信息,通过点击聊天按钮直接向凯文发送信息聊天盒启动,凯文发送信息,凯文收到信息 我通过将发送信息的人(Matt)和接收信息的人(Kevin)连接成一个id来生成聊天id var me = "Matt"; var user = "Kevin"; var uniqueChatID = me+user; 当我保存消息服务器端(使用mongoDB)时,消息对象有一个chatID的MattKevin。因此,现在当我想回到聊天室时,我可以使用MattKe

假设我有两个用户,“马特”和“凯文”。马特想给凯文发信息,通过点击聊天按钮直接向凯文发送信息聊天盒启动,凯文发送信息,凯文收到信息

我通过将发送信息的人(Matt)和接收信息的人(Kevin)连接成一个id来生成聊天id

var me = "Matt";
var user = "Kevin";
var uniqueChatID = me+user;
当我保存消息服务器端(使用mongoDB)时,消息对象有一个
chatID
MattKevin
。因此,现在当我想回到聊天室时,我可以使用
MattKevin
chatID
拉入所有消息

这很好,直到Kevin想启动与Matt的聊天,然后id变成
KevinMatt
。现在我引用了一个不同的聊天,它是向后的。因此,如果我想传递
uniqueChatID
以获取消息,它将拉取一个不同的集合

var me = "Kevin";
var user = "Matt";
var uniqueChatID = me+user;

所以我很好奇,我怎么才能把这个设置得更好一点,让我的程序知道,好吧,马特和凯文聊天,所以如果马特给凯文发短信,凯文就会把他们的聊天拉进来,反之亦然,凯文会给马特发短信,马特和凯文收到相同的短信?

按字母顺序排序:

var me = "Kevin";
var user = "Matt";
var uniqueChatID = [me, user].sort().join('');
这就是说,虽然这在技术上是可行的,但我建议您做一点内务管理——确保它们始终是小写的,并确保在您的数据库中强制使用唯一的用户名。或者,我甚至建议给用户一个唯一的标识符(比如UUID),并用它来创建UCID:

var me = CurrentUser.uuid(); // 8cb3ebb8-30f9-11e5-a151-feff819cdc9f
var targetUser = Chat.targetUser(); // Matt: 9bc1ef9c-6719-4041-afd3-c5b87c90690d
var uniqueChatID = [me, targetUser].sort().join(',');
// 8cb3ebb8-30f9-11e5-a151-feff819cdc9f,9bc1ef9c-6719-4041-afd3-c5b87c90690d

最后,如果db支持关系或连接,那么最好的选择是为每个聊天分离聊天表/集合,并在用户和聊天室之间“连接”(或创建关系)。然后,下次你去加载它时,连接将引导你到一个独特的聊天室,该聊天室连接到两个用户。

我认为你的方法太复杂了。此外,您似乎希望将单独的聊天信息嵌入带有创建的
\u id
的文档中。这里的问题是,在写这篇文章的时候有一个问题。一旦达到这个极限,你的用户就不能再进行交流了。增加文档的大小还可能导致频繁的操作,这是一项非常昂贵的操作,除非您使用MongoDB 3.0版中引入的新WiredTiger存储引擎

因此,我们需要一种更具可扩展性的方法

我会这样做:

用户:

信息:

{
  _id: new ObjectId(),
  from: "Kevin",
  /* You might want to have multi-person chats, hence the array */
  to: ["Matt"],
  ts: new ISODate(),
  message: "Hi, Matt!"
}
索引:

db.messages.ensureIndex({from:1,to:1,ts:1})
用于重建用户收到的所有消息的查询:

var user = "Matt"
db.messages.find({"to": user}).sort({ts:1})
现在,您可以迭代结果集,并为找到的每个“发件人”打开一个聊天窗口

用于重建已定义聊天记录的查询

var user = "Matt"
var sender = "Kevin"
db.messages.find({"from": sender, "to":user}).sort({ts:1})
将按时间顺序向您发送凯文发送给马特的所有消息。因为两个查询都应该使用索引,所以它们应该非常快。您可以使用
.limit(x)
仅查询发送给
用户的最后x条消息


使用这种方法,您不需要人工的
\u id
,创建的索引允许您高效地执行与参与者相关的每个查询,并且消息可以按顺序排序。由于每封邮件都是单独保存的,不再更改,因此您可以存储几乎无限数量的邮件,从而绕过文档重新定位问题。

按字母顺序排序?好的,那么客户端将按字母顺序生成ID?非常有趣,很酷。没想到这一点,好主意:)这对于大型应用程序来说并不是唯一的。是的,因为它不像Kevin或Matt那样随意,它的昵称是唯一的。CurrentUser
&&Chat从何而来?哦,这只是一个伪代码,表明您可能有一个代表它们的类singleton。可能也是一个变量。非常酷的人,谢谢分享,我和一个朋友讨论过,他推荐了一个类似的方法。我看不出我的方法是如何处理复杂或密集的问题?我正在使用套接字,所以当套接字数据到达服务器时,它会存储数据,然后通过套接字将数据发送给您。如果你和我聊天,我们所有的信息都存储在这里,对吧。每条消息都有一个
chatID
,当页面刷新并且您想返回聊天室时,它只会获取您和我生成的
chatID
的所有消息。让我认真分析一下你在这里说的话,这样我才能理解。
var user = "Matt"
var sender = "Kevin"
db.messages.find({"from": sender, "to":user}).sort({ts:1})