我有一组传感器数据,其中每个文档都具有以下结构:
[{ _id: 592d9b0e276bd2136caacca0,
name: 5
light: [ ... ],
temperature: [ ... ],
UV: [ ... ],
RA: [ ... ]
}]
每个传感器的每个阵列的长度为100个元素。
例如,我如何检索哪个名称的文件具有最高42位温度值(在温度数组中)?
第一个元素或最后一个元素有很多解决方案,但我似乎无法找到如何为数组的任意位置求解它。
这就是我已经拥有的:
db.sensors.aggregate([
{ $unwind: "$name" },
{ $sort: { "temperature": -1} },
{ $limit: 1}
]);
但正如你所看到的那样," {$ sort:{" temperature":-1}}"不管用。我真的不明白如何指定我只想对温度数组的第42位元素进行排序。
答案 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
指定要返回的所有字段: