在数组中的位置查找元素的最大值

时间:2017-05-30 22:11:23

标签: node.js mongodb mongodb-query aggregation-framework

我有一组传感器数据,其中每个文档都具有以下结构:

[{ _id: 592d9b0e276bd2136caacca0,
    name: 5
    light: [ ... ],
    temperature: [ ... ],
    UV: [ ... ],
    RA: [ ... ]
}]

每个传感器的每个阵列的长度为100个元素。

例如,我如何检索哪个名称的文件具有最高42位温度值(在温度数组中)?

第一个元素或最后一个元素有很多解决方案,但我似乎无法找到如何为数组的任意位置求解它。

这就是我已经拥有的:

db.sensors.aggregate([
    { $unwind: "$name" },
    { $sort: { "temperature": -1} },
    { $limit: 1}
]);

但正如你所看到的那样," {$ sort:{" temperature":-1}}"不管用。我真的不明白如何指定我只想对温度数组的第42位元素进行排序。

1 个答案:

答案 0 :(得分:1)

如果您要查找给定位置的值,则可以使用$arrayElemAt返回所提供位置的值。通用数组符号为n-1,因此从41开始的第42个位置为0

db.sensors.aggregate({
  { "$addFields": {
     "pos": { "$arrayElemAt": [ "$temperature", 41 ] } }
  }},
  { "$sort": { "pos": -1 } },
  { "$limit": 1 }
])

你甚至可以使用$exists作为查询参数来加速这个过程,只是为了查看实际上有42个元素的数组,因为其他任何东西都会被考虑丢弃:

db.sensors.aggregate({
  { "$match": { "temperature.41": { "$exists": true } } },
  { "$addFields": {
     "pos": { "$arrayElemAt": [ "$temperature", 41 ] } }
  }},
  { "$sort": { "pos": -1 } },
  { "$limit": 1 }
])

另请注意,在没有$addFields管道运算符的早期版本中,您改为使用$project指定要返回的所有字段: