Mongodb 如何优化设计?

Mongodb 如何优化设计?,mongodb,Mongodb,用例: { _id : device Id | issue id, device id : "123", ... //all device fields issue_id:"12", //all issue fields } 我在卖设备。每个设备都会将数据发回给我。我正在计算每个设备的问题 设备信息: { _id : device Id | issue id, device id : "123"

用例:

  {
  _id : device Id | issue id,
  device id : "123",
  ... //all device fields
  issue_id:"12",
  //all issue fields
  }
我在卖设备。每个设备都会将数据发回给我。我正在计算每个设备的问题

设备信息:

  {
  _id : device Id | issue id,
  device id : "123",
  ... //all device fields
  issue_id:"12",
  //all issue fields
  }
  • 客户名称
  • 出售地点
  • 设备id
  • 设备组
问题信息:

  {
  _id : device Id | issue id,
  device id : "123",
  ... //all device fields
  issue_id:"12",
  //all issue fields
  }
  • 问题ID
  • 发行详情
  • 问题严重性
  • 发行状态
  • 问题可以显示给客户
我当前的设计:

  {
  _id : device Id | issue id,
  device id : "123",
  ... //all device fields
  issue_id:"12",
  //all issue fields
  }
它不是嵌套文档。它是扁平结构

此结构存在问题:

  {
  _id : device Id | issue id,
  device id : "123",
  ... //all device fields
  issue_id:"12",
  //all issue fields
  }
问题信息在所有设备中都应该是唯一的。但问题严重性和问题详细信息等问题字段因系统而异。独特的问题是20K。我有1000万个文档,这意味着我在所有设备上总共有1000万个问题。由于这种扁平化结构,我必须更新来自每个设备的每条消息的所有问题。这是低效的。我正在考虑做下面这样的事情

思维过程:

  {
  _id : device Id | issue id,
  device id : "123",
  ... //all device fields
  issue_id:"12",
  //all issue fields
  }
单个文档结构如下所示

 {
  issue_id: "12",
  issue_desc: "add",
  issue_public: "No",
  devices:{
   deviceId_one: {
    device_id:
    //all device details
    //issue_recieved_time
    //issue_severity
   },
   deviceId_two: {
   }
  }
这种新设计的问题是,如何查询与设备Id 2相关的所有问题。因为设备id字段是动态的

我读到mongodb不适合加入。因为我期望以下类似的查询在毫秒内得到响应

  • 查找设备组请求的所有问题信息

  • 查找销售给单个客户的所有问题信息

  • 查找可向客户显示/未向客户显示的所有计数以及严重程度,如严重、严重、高、低等

    公众高计数 公众严重计数 私人高计数


  • 我对新的数据源很满意。但现在看起来尤其是w.r.t mongodb。有什么想法吗?

    你可以使用基于时间的扣球。使用
    issue\u received\u time
    字段创建存储桶。存储桶粒度取决于问题的频率

    例如,每小时

    {
      "issue_id":"12",
      "issue_desc":"add",
      "issue_public":"No",
      "start_date":"2019-03-25T10:00:00.000Z",
      "end_date":"2019-03-25T10:59:59.000Z",
      "devices":[
        {
          "device_group":1,
          "issue_recieved_time":"2019-03-25T10:00:00.000",
          "issue_severity":"high",
          "show":true
        },
        .....
        {
          "device_id":10,
          "issue_recieved_time":"2019-03-25T10:30:00.000Z",
          "issue_severity":"low"
          "show":false
        }
      ]
    }
    
    查找设备组请求的所有问题信息

    查找销售给单个客户的所有问题信息

    与上面的客户过滤器类似

    查找所有可以显示/未显示给客户的计数 以及严重程度,如严重、严重、高、低等

    但我应该得到最新的信息


    您可以将
    设备
    定义为数组(
    设备
    :[{device1},{device2}]),它是可索引的,易于更新,等等。问题和设备基数是什么?1:N、N:1或N:M?@Valijon一台设备可能有一个或多个问题。问题是更新失败/需要更新/主板失败/存储空间满之类的事情。一个问题可能是1000万台设备的一部分。我有大约20个设备字段。如果我将设备保持为阵列,它是否可扩展?我认为这更适合您的用例。更新、查询等都很容易。@Valijon文档大小可能超过16MB。谢谢。但我应该得到最新的信息。有了这个设计,有可能吗?我真的要试一试。我的疑问是这些查询的性能如何。这很难说。我没有你拥有的数据。你必须尝试一下。我可以根据您的发现提出优化建议。假设今天有一台设备发送问题1的更新。问题1是我们一周前收到信息的设备2的一部分。当我查询时,我是否也会得到设备2信息?如果它们属于同一个设备组,则答案中的查询1将拉取两个设备。