用例:
我在卖设备。每个设备都把数据发回给我。我在计算每个设备的问题。
设备信息:
F 213
发行信息:
severity
F 227
我的当前设计:
{
_id : device Id | issue id,
device id : "123",
... //all device fields
issue_id:"12",
//all issue fields
}它不是嵌套的文档。它是扁平的结构。
具有此结构的问题:
所有设备的问题信息都应该是唯一的。但是,问题严重性和问题细节这样的问题字段在每个系统中是不同的。独特的问题是20K。我有1000万份文档,这意味着我在所有设备上都有1000万个问题。由于这种扁平的结构,我不得不更新来自每个设备的每条消息的所有问题。效率很低。我正在考虑做下面这样的事情。
思维过程:
单个文档结构如下所示。
{
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。有什么想法吗?
发布于 2020-03-26 02:42:45
你可以用时间为基础的桶。利用issue_recieved_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
}
]
}查找为设备组请求的所有问题信息。
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}}
])查找销售给单个客户的所有问题信息
类似于上面的客户过滤器
发现所有这样的计数都可以显示/不显示给客户,以及严重的、严重的、高的、低的等等。
db.collectionname.aggregate([
{"$unwind":"$devices"},
{"$group":{
"_id":{"show":"$devices.show","severity":"$devices.issue_severity"},
"count":1
}}
])但是我应该得到最新的发行信息
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}}
])https://stackoverflow.com/questions/60776544
复制相似问题