我有一组传感器数据,每个文档都有以下结构:
[{ _id: 592d9b0e276bd2136caacca0,
name: 5
light: [ ... ],
temperature: [ ... ],
UV: [ ... ],
RA: [ ... ]
}]每个传感器的每个阵列都有100个元素的长度。
例如,我如何检索哪个名称的温度值最高(在温度数组中)?
对于第一个元素或最后一个元素,有很多解决方案,但我似乎找不到如何解决数组中任意位置的问题。
这是我已经拥有的:
db.sensors.aggregate([
{ $unwind: "$name" },
{ $sort: { "temperature": -1} },
{ $limit: 1}
]);但是,正如您所看到的,"{ $sort:{“温度”:-1 }“的行将不能工作。我真的不明白如何指定只对温度数组的42位置的元素进行排序。
发布于 2017-05-31 01:26:22
如果在给定位置寻找值,则可以使用$arrayElemAt在所提供的位置返回值。对于它,常用的数组表示法是n-1,所以第42位是从0开始的索引中的41。
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返回的所有字段。
https://stackoverflow.com/questions/44272740
复制相似问题