我有一个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,而不指定要切片的每个数组的键?
答案 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)
尽管如此,很难知道这对您来说是否是一个有用的改变。你为什么不知道给定的设备测量什么?你正在做什么设备可能会或可能不会产生的神秘测量?检索特定设备的神秘参数的最后几百个条目有什么用?我可以通过这样的更多信息来改进答案。您可能最终必须查询给定设备捕获的参数,然后使用该信息查询所需的信息。
至少,上面使用的结构很麻烦,因为它涉及多个数组不受约束地增长。这很糟糕,因为增长数组会导致文档必须在磁盘上移动很多。忘记索引数组 - 性能会很糟糕。