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

时间:2015-01-13 07:56:25

标签: javascript mongodb mongodb-query

我有一个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()通过使用纯JavaScript迭代测量JSON结构来处理此结构。

我需要帮助的地方:一旦这些参数数组增长到一个显着的大小,我实际上只想在我的查找中切掉每个元素的最后几百个( )或findOne(),而不是返回整个设备记录,然后迭代并切断它们,如果大多数设备记录是无关紧要的。

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

1 个答案:

答案 0 :(得分:0)

我需要更多地了解您的用例才能获得明确的帮助,但从我听到的情况来看,我认为您应该考虑重新组织数据。我会组织数据,以便文档代表单个设备在单个时刻对单个参数的单次测量:

{
    "_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)

尽管如此,很难知道这对您来说是否是一个有用的改变。你为什么不知道给定的设备测量什么?你正在做什么设备可能会或可能不会产生的神秘测量?检索特定设备的神秘参数的最后几百个条目有什么用?我可以通过这样的更多信息来改进答案。您可能最终必须查询给定设备捕获的参数,然后使用该信息查询所需的信息。

至少,上面使用的结构很麻烦,因为它涉及多个数组不受约束地增长。这很糟糕,因为增长数组会导致文档必须在磁盘上移动很多。忘记索引数组 - 性能会很糟糕。