首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在MongoDB中进行嵌套计数?

如何在MongoDB中进行嵌套计数?
EN

Stack Overflow用户
提问于 2020-12-21 13:07:07
回答 1查看 39关注 0票数 1

我有一个电子邮件应用程序,它使用如下所示的DB模式:

代码语言:javascript
复制
db={
  "archives": [
    {
      "header": {
        "subject": "message-1",
        "message-id": "a"
      }
    },
    {
      "header": {
        "subject": "Re:message-1",
        "message-id": "b",
        "reply-to": [
          "a"
        ]
      }
    },
    {
      "header": {
        "subject": "Re:message-1",
        "message-id": "c",
        "reply-to": [
          "a"
        ]
      }
    },
    {
      "header": {
        "subject": "message-2",
        "message-id": "d"
      }
    },
    {
      "header": {
        "subject": "Re:message-2",
        "message-id": "e",
        "reply-to": [
          "d"
        ],
        
      }
    }
  ]
}

我可以列出所有开始的电子邮件(那些没有reply-to标签)如下:

代码语言:javascript
复制
db.archives.aggregate([
  {
    $match: {
      "header.reply-to": {
        $exists: false
      }
    }
  }
])

这表明只有message-id: amessage-id: d才是开始发送的电子邮件:

代码语言:javascript
复制
[
  {
    "_id": ObjectId("5a934e000102030405000000"),
    "header": {
      "message-id": "a",
      "subject": "message-1"
    }
  },
  {
    "_id": ObjectId("5a934e000102030405000003"),
    "header": {
      "message-id": "d",
      "subject": "message-2"
    }
  }
]

我无法弄清楚的是,如何获得回复的数量,每个开始的电子邮件。在本例中:

  • 消息-ID:A2答复
  • 消息-ID:D1应答

我在MongoDB操场上发布了这个示例:https://mongoplayground.net/p/H6IT0SfCqBp

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-21 15:55:50

  • 具有相同集合的$lookup,将header.message-id传递为localField,将header.reply-to传递为foreignField
  • $size获取repliesCount数组中的总元素
代码语言:javascript
复制
db.archives.aggregate([
  { $match: { "header.reply-to": { $exists: false } } },
  {
    $lookup: {
      from: "archives",
      localField: "header.message-id",
      foreignField: "header.reply-to",
      as: "repliesCount"
    }
  },
  { $addFields: { repliesCount: { $size: "$repliesCount" } } }
])

游乐场

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

https://stackoverflow.com/questions/65393341

复制
相关文章

相似问题

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