首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于mongodb中子文档数组中的数组的条件计数?

基于mongodb中子文档数组中的数组的条件计数?
EN

Stack Overflow用户
提问于 2021-06-03 13:10:28
回答 1查看 55关注 0票数 0

我收集了一些闲聊

代码语言:javascript
复制
    {
      "_id": "60b886babeeb7301c49cd114",
      "participants": [
        "6096c0067a9acc2164f4a14e",
        "6096bfea7a9acc2164f4a14c"
      ],
      "access": [
        "6096c0067a9acc2164f4a14e",
        "6096bfea7a9acc2164f4a14c"
      ],
      "messages": [
        {
          "access": [
            "6096c0067a9acc2164f4a14e"
          ],
          "seen": [
            "6096bfea7a9acc2164f4a14c"
          ],
        "message": "This is message 5",
        "from": "6096bfea7a9acc2164f4a14c",
          "_id": "60b88764da05c21e5483410b",
        },
        
      ],
    },...

我希望将聊天返回到聊天的访问列表中请求用户的位置,但我也需要发送一些附加信息,例如聊天的最后一条消息和总未见消息。每次聊天都会收到一些看不见的信息,这给我带来了麻烦。在我的脑子里应该是这样的。

  1. Traverse/Unwind消息数组。
  2. 检查每条消息是否在access列表中,而不是在seen列表增量中。
  3. 将此计数添加到每个聊天对象中。

我试图找到一个纯mongodb解决方案,包含聚合管道、位置项目,但无法找到实现上述步骤的任何方法。

我现在是如何做的,是在过滤了聊天之后,在JavaScript中遍历游标。

代码语言: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的情况下实现这一点呢?如果您喜欢对模式进行任何更改,我会感觉到我的模式设计不是很理想。

EN

回答 1

Stack Overflow用户

发布于 2021-06-03 16:34:39

不是一个答案,但既然你要求基于你目前的模型的模式设计建议-

我不认为数据模型对于消息的粒度控制有什么意义。我建议您为聊天应用程序提供3种模式。

  1. Chat -这将有可以访问聊天/组的用户列表

{

“用户”:{Str(User._id: Object(User)},// Map,因为这降低了搜索的复杂性

“消息”:数组(消息)

}

  1. User -多对多与聊天的关系。还将存储用于按chat.messages.seen_by.append(user._id)的索引更新“user._id”的“最后读取消息id索引”。

{

聊天:{ Str( chat ):Object(Str),

lastMessageReadIndex:号码

}

  1. Message -一对多与聊天的关系。将存储消息以及用户列表所看到的消息。

{

聊天:Obj(聊天),txt: string,seen_by : ArrayUser }

这是一个虚拟模型,您可以根据您的首选项进一步更新模式。希望这种方法能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67822128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档