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)
不过,根据您对用例的描述,很难知道这是否对您有用。您为什么不知道给定设备测量的是什么?您如何处理设备可能产生或不产生的神秘测量结果?检索特定设备神秘参数的最后几百个条目有什么用?我也许可以通过这样的更多信息来改进答案。您可能最终不得不查询给定设备捕获的参数,然后使用该信息来查询您想要的信息。
至少,您上面使用的结构是有问题的,因为它涉及到无限增长的多个数组。这很糟糕,因为增加数组会导致文档必须在磁盘上移动很多。忘记索引数组 - 性能会很糟糕。
我有一个 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)
不过,根据您对用例的描述,很难知道这是否对您有用。您为什么不知道给定设备测量的是什么?您如何处理设备可能产生或不产生的神秘测量结果?检索特定设备神秘参数的最后几百个条目有什么用?我也许可以通过这样的更多信息来改进答案。您可能最终不得不查询给定设备捕获的参数,然后使用该信息来查询您想要的信息。
至少,您上面使用的结构是有问题的,因为它涉及到无限增长的多个数组。这很糟糕,因为增加数组会导致文档必须在磁盘上移动很多。忘记索引数组 - 性能会很糟糕。