按重复值分隔记录
Posted
技术标签:
【中文标题】按重复值分隔记录【英文标题】:Delimit records by recurring value 【发布时间】:2022-01-22 04:45:21 【问题描述】:我有包含对象数组的文档。在该数组中是数据集中的脉冲。例如:
samples: ["time":1224960,"flow":0,"temp":null,"time":1224970,"flow":0,"temp":null,
"time":1224980,"flow":23,"temp":null,"time":1224990,"flow":44,"temp":null,
"time":1225000,"flow":66,"temp":null,"time":1225010,"flow":0,"temp":null,
"time":1225020,"flow":650,"temp":null,"time":1225030,"flow":40,"temp":null,
"time":1225040,"flow":60,"temp":null,"time":1225050,"flow":0,"temp":null,
"time":1225060,"flow":0,"temp":null,"time":1225070,"flow":0,"temp":null,
"time":1225080,"flow":0,"temp":null,"time":1225090,"flow":0,"temp":null,
"time":1225100,"flow":0,"temp":null,"time":1225110,"flow":67,"temp":null,
"time":1225120,"flow":23,"temp":null,"time":1225130,"flow":0,"temp":null,
"time":1225140,"flow":0,"temp":null,"time":1225150,"flow":0,"temp":null]
我想构建一个聚合管道来对大于零的连续“samples.flow”值的每个集合进行操作。如中,样本脉冲由一个或多个零流量值界定。我可以使用 $unwind 阶段来展平数据,但我不知道如何随后对每个脉冲进行分组。我不反对这是一个多步骤的过程。但我宁愿不必在客户端的代码中循环遍历它。数据将包含来自多个文档的字段,总计可能有数十万个条目。
从上面的示例中我希望能够提取:
["time":1224980,"total_flow":123,"temp":null,
"time":1225020,"total_flow":750,"temp":null,
"time":1225110,"total_flow":90,"temp":null]
或其变体。
【问题讨论】:
您可以尝试在samples
数组字段上使用$reduce
。
我一直在努力让它工作,但我一直坚持如何对我想要 $reduce 采取行动的样本进行分组。我需要它在每次遇到流量时发出一个值:0。
【参考方案1】:
如果您不是要在 time
字段上查找特定值,则可以将此管道与 $bucketAuto
一起使用。
[
"$bucketAuto":
"groupBy": "$time",
"buckets": 3,
"output":
total_flow:
$sum: "$flow"
,
temp:
$first: "$temp"
,
time:
"$min": "$time"
,
"$project":
"_id": 0
]
如果您正在寻找time
的一些特定值,那么您将需要使用$bucket
并为其提供具有预先计算的下限的边界参数。我认为这个解决方案应该可以完成您的工作
【讨论】:
$bucket 的建议很有意思。我忘记了它的存在!但我没有看到一种基于流量值为零作为上下边界进行过滤的方法。 能否请您澄清这一点flow value of zero as the lower and upper boundaries
最好有演示?
在为 $bucket 设置边界时,您可以按偶数拆分,也可以设置边界。正如您所建议的,这些边界类似于时间块。在我的情况下,我希望边界位于字段“流”为 0 的位置。如 groupBy:“流”,边界:[0,0,0]。我想我可能需要遍历数据并使用 js 函数。以上是关于按重复值分隔记录的主要内容,如果未能解决你的问题,请参考以下文章