首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何优化设计?

如何优化设计?
EN

Stack Overflow用户
提问于 2020-03-20 14:54:59
回答 1查看 113关注 0票数 0

用例:

我在卖设备。每个设备都把数据发回给我。我在计算每个设备的问题。

设备信息:

  • 客户名
  • location出售
  • 设备id
  • 设备组

F 213

发行信息:

severity

  • Issue
  • 发出ID
  • 发出
  • 状态
  • 问题可显示给客户

F 227

我的当前设计:

代码语言:javascript
复制
  {
  _id : device Id | issue id,
  device id : "123",
  ... //all device fields
  issue_id:"12",
  //all issue fields
  }

它不是嵌套的文档。它是扁平的结构。

具有此结构的问题:

所有设备的问题信息都应该是唯一的。但是,问题严重性和问题细节这样的问题字段在每个系统中是不同的。独特的问题是20K。我有1000万份文档,这意味着我在所有设备上都有1000万个问题。由于这种扁平的结构,我不得不更新来自每个设备的每条消息的所有问题。效率很低。我正在考虑做下面这样的事情。

思维过程:

单个文档结构如下所示。

代码语言:javascript
复制
 {
  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不是用来加入的。因为我期望以毫秒为单位响应以下类似的查询。

  1. 查找为设备组

请求的所有问题信息。

  1. 查找出售给单个客户

的所有问题信息。

  1. 发现所有这样的计数都可以显示/不显示给客户,以及严重的、严重的、高的、低的等等。

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

我对新的数据源没意见。但特别是现在看上去像w.r.t mongodb。有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2020-03-26 02:42:45

你可以用时间为基础的桶。利用issue_recieved_time字段创建桶。桶粒度取决于问题的频率。

例如-每小时

代码语言:javascript
复制
{
  "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
    }
  ]
}

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

代码语言:javascript
复制
db.collectionname.aggregate([
  {"$match":{"devices.device_group":1}},
  {"$addFields":{
    "issues_devices":{
      "$map":{
        "input":{
          "$filter":{
            "input":"$devices",
            "cond":{"$eq":["$$this.device_group",1]}
          }
        },
        "in":{
          "issue_recieved_time":"$$this.issue_recieved_time",
          "issue_severity":"$$this.issue_severity"
        }
      }
    }
  }},
  {"$unwind":"$issues_devices"},
  {"$replaceRoot":{"newRoot":{"$mergeObjects":["$$ROOT","$issues_devices"]}}},
  {"$project":{"issues_devices":0}}
])

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

类似于上面的客户过滤器

发现所有这样的计数都可以显示/不显示给客户,以及严重的、严重的、高的、低的等等。

代码语言:javascript
复制
db.collectionname.aggregate([
  {"$unwind":"$devices"},
  {"$group":{
    "_id":{"show":"$devices.show","severity":"$devices.issue_severity"}, 
    "count":1
  }}
])

但是我应该得到最新的发行信息

代码语言:javascript
复制
db.collectionname.aggregate([
  {"$sort":{"end_date":-1}},
  {"$group":{
     "_id":"$issue_id",
     "latest":{"$first":"$$ROOT"}
  }},
  //additional stages if you need to pull in the issue information from devices
  {"$addFields":{
    "issues_devices":{
      "$map":{
        "input":"$latest",
        "in":{
          "issue_recieved_time":"$$this.issue_recieved_time",
          "issue_severity":"$$this.issue_severity"
        }
      }
    }
  }},
  {"$unwind":"$issues_devices"},
  {"$replaceRoot":{"newRoot":{"$mergeObjects":["$$ROOT","$issues_devices"]}}},
  {"$project":{"issues_devices":0}}
])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60776544

复制
相关文章

相似问题

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