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将拉取两个设备。