MongoDB 来自一组未知子文档的每一个的 $slice

MongoDB $slice from each of a set of unknown subdocuments

我有一个 MongoDB 集合,其中一组设备分别存储各种物理参数的数组测量值——例如不同的电压、温度等——但这些参数既不常见也不可预测每个。示例:

{
  device_id: 1,
  measurements:
  {
    parameter_one:
    [
      {measurement object #1}, {measurement object #2}, ... {measurement object #n}
    ],
    parameter_two:
    [
      {measurement object #1}, {measurement object #2}, ... {measurement object #m}
    ],
    ...
  }
},
{
  device_id: 2,
  measurements:
  {
    parameter_one:
    [
      {measurement object #1}, {measurement object #2}, ... {measurement object #l}
    ],
    parameter_three:
    [
      {measurement object #1}, {measurement object #2}, ... {measurement object #k}
    ]
  }
}

如您所见,有些设备测量相同的参数,有些参数对于某些设备来说是唯一的,一般来说,我无法知道设备的 measurement 子文档中的参数键会是什么是。

一旦我使用 .find() 或 .findOne() return编辑了这个结构,我就知道如何处理它了,方法是使用纯 JSON 结构迭代测量 JSON =27=].

这是我需要帮助的地方:一旦这些参数数组增长到相当大的大小,我实际上只想切掉我找到的每个元素的最后几百个() 或 findOne(),而不是 return 整个设备记录,然后如果大部分设备记录不相关则迭代并切掉它们。

但是,如前所述,我不能只说 $slice: {measurements.parameter_key: -N},因为我先验地不知道那些 parameter_key 对于任何给定的设备记录是什么。有没有办法在 Mongo 查询中迭代未知子文档并对每个子文档应用 $slice,而不指定要切片的每个数组的键?

我需要更多地了解您的用例才能提供明确的帮助,但据我所知,我认为您应该考虑重新组织数据。我会组织数据,以便文档代表单个设备在单个时刻对单个参数的单个测量值:

{
    "_id" : ObjectId(...),
    "device_id" : 1,
    "parameter" : "parameter_one",
    "measurement" : { // measurement object - whatever this looks like },
    "date" : ISODate(...)
}

要找到设备测量数组的最后几百个条目的等效项,索引 { "device_id" : 1, "date" : -1 },然后按 date 降序排序并使用限制:

db.measurements.find({ "device_id" : 1 }, { "date" : -1 }).limit(691)

不过,根据您对用例的描述,很难知道这是否对您有用。您为什么不知道给定设备测量的是什么?您如何处理设备可能产生或不产生的神秘测量结果?检索特定设备神秘参数的最后几百个条目有什么用?我也许可以通过这样的更多信息来改进答案。您可能最终不得不查询给定设备捕获的参数,然后使用该信息来查询您想要的信息。

至少,您上面使用的结构是有问题的,因为它涉及到无限增长的多个数组。这很糟糕,因为增加数组会导致文档必须在磁盘上移动很多。忘记索引数组 - 性能会很糟糕。