【发布时间】:2021-06-04 00:34:39
【问题描述】:
我有一组聊天记录
{
"_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 的情况下实现这一点?如果您愿意建议对架构进行任何更改,我觉得我的架构设计不是很优化。
【问题讨论】:
-
聊天中“访问”的目的是什么?您是否在限制来自其他用户的聊天消息?
-
聊天中的访问列表限制了对整个聊天的访问。每条消息也有一个访问列表,可以进行更精细的控制。