按重复值分隔记录

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 函数。

以上是关于按重复值分隔记录的主要内容,如果未能解决你的问题,请参考以下文章

Unix - 如何应用一个字段分隔分隔符来解释异常[重复]

HTML5本地存储数据是不是按域分隔存储[重复]

按最近日期加入 BigQuery 中具有重复记录的表

获取字符串,按分隔符拆分并插入到 Oracle 中的表过程 [重复]

多行到一个唯一的逗号分隔值[重复]

在foreach循环中输出逗号分隔值[重复]