我收集了一些闲聊
{
"_id": "60b886babeeb7301c49cd114",
"participants": [
"6096c0067a9acc2164f4a14e",
"6096bfea7a9acc2164f4a14c"
],
"access": [
"6096c0067a9acc2164f4a14e",
"6096bfea7a9acc2164f4a14c"
],
"messages": [
{
"access": [
"6096c0067a9acc2164f4a14e"
],
"seen": [
"6096bfea7a9acc2164f4a14c"
],
"message": "This is message 5",
"from": "6096bfea7a9acc2164f4a14c",
"_id": "60b88764da05c21e5483410b",
},
],
},...我希望将聊天返回到聊天的访问列表中请求用户的位置,但我也需要发送一些附加信息,例如聊天的最后一条消息和总未见消息。每次聊天都会收到一些看不见的信息,这给我带来了麻烦。在我的脑子里应该是这样的。
access列表中,而不是在seen列表增量中。我试图找到一个纯mongodb解决方案,包含聚合管道、位置项目,但无法找到实现上述步骤的任何方法。
我现在是如何做的,是在过滤了聊天之后,在JavaScript中遍历游标。
let messages = chat.messages;
let unseenMessages = 0;
messages.forEach(msg => {
if (
msg.access.includes(req.session.userId) &&
!msg.seen.includes(req.session.userId)
) {
unseenMessages += 1;
console.log('unseen message', msg.message);
}
});有什么方法可以在不涉及JavaScript的情况下实现这一点呢?如果您喜欢对模式进行任何更改,我会感觉到我的模式设计不是很理想。
发布于 2021-06-03 16:34:39
不是一个答案,但既然你要求基于你目前的模型的模式设计建议-
我不认为数据模型对于消息的粒度控制有什么意义。我建议您为聊天应用程序提供3种模式。
{
“用户”:{Str(User._id: Object(User)},// Map,因为这降低了搜索的复杂性
“消息”:数组(消息)
}
{
聊天:{ Str( chat ):Object(Str),
lastMessageReadIndex:号码
}
{
聊天:Obj(聊天),txt: string,seen_by : ArrayUser }
这是一个虚拟模型,您可以根据您的首选项进一步更新模式。希望这种方法能有所帮助。
https://stackoverflow.com/questions/67822128
复制相似问题