如何解决如何在mongodb中按地理空间属性分组?
我在mongodb中有一组文档,并且我尝试使用距给定文档100m半径内最接近的Geopoint坐标对文档集进行分组,并获得type
和{{ $first
的1}}值。示例文档集如下。有没有办法使用mongodb聚合管道中的现有功能来执行此操作,还是必须使用新引入的cordinates
来构建自定义聚合功能。任何建议都将受到高度赞赏。
$function
一个示例文档,有望在聚合管道之后作为输出。
{"_id":{"$oid":"5e790cfe46fa8260f41d2626"},"cordinates":[103.96277219999999,1.3437526],"timestamp":1584991486436,"user":{"$oid":"5e4bbbc31eac8e2e3ca219a6"},"type": 1,"__v":0}
{"_id":{"$oid":"5e790d7346fa8260f41d2627"},"cordinates":[103.97242539965999,1.33508],"timestamp":1584991603400,"__v":0}
{"_id":{"$oid":"5e790d7346fa8260f41d2627"},"cordinates":[103.97242539990099,1.33518],"timestamp":1584991603487,"type": 2,"__v":0}
解决方法
我设法通过构建一个自定义函数来表示地理空间坐标的单个值,然后按返回的值进行分组来解决此问题。我能够将附近的坐标分组到一个文档中,因为我用来转换值的函数也将映射到附近的标量值。到目前为止,它已经为我提供了热图的预期输出。但是我仍然不确定这是否是正确的方法。为此应该有一个更好的答案。我已经在下面发布了我的聚合管道。任何建议,以改善这一点。
[
{
'$match': {
'timestamp': {
'$gte': 1599889338000
}
}
},{
'$addFields': {
'singleCoordinate': {
'$function': {
'body': 'function(coordinates){return ((coordinates[1]+90)*180+coordinates[0])*1000000000000;}','args': [
'$coordinates','$geonear'
],'lang': 'js'
}
}
}
},{
'$group': {
'_id': {
'$subtract': [
'$singleCoordinate',{
'$mod': [
'$singleCoordinate',100
]
}
]
},'coordinates': {
'$first': '$coordinates'
},'avgType': {
'$avg': '$type'
}
}
},{
'$addFields': {
'latitude': {
'$arrayElemAt': [
'$coordinates',1
]
},'longitude': {
'$arrayElemAt': [
'$coordinates',0
]
},'weight': {
'$multiply': [
'$avgType','$_id'
]
}
}
},{
'$project': {
'_id': false,'coordinates': false,'avgType': false
}
}
]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。