猫鼬地理定位动态最大距离[重复]
Posted
技术标签:
【中文标题】猫鼬地理定位动态最大距离[重复]【英文标题】:Mongoose geolocation dynamic max distance [duplicate] 【发布时间】:2019-07-06 15:49:04 【问题描述】:目前我正在使用 MongoDB,并且我有一个具有以下架构的用户集合:
const DEFAULT_JOB_RADIUS = 5000 // In meters
const settingsSchema = new Schema(
jobRadius:
type: Number,
default: DEFAULT_JOB_RADIUS
)
const userSchema = new Schema(
firstName:
trim: true,
type: String
,
lastName:
trim: true,
type: String
,
email:
trim: true,
type: String,
unique: true
,
password:
type: String
,
token:
type: String
,
fcmToken:
type: String
,
lastLocation:
type: pointSchema
,
settings:
type: settingsSchema,
default: settingsSchema
,
timestamps: true
)
点模式如下所示:
const mongoose = require('mongoose')
const Schema = mongoose.Schema
const pointSchema = new Schema(
type:
type: String,
enum: ['Point'],
default: 'Point'
,
coordinates:
type: [Number],
default: [0, 0],
index: '2dsphere'
);
module.exports = pointSchema
每个用户都有一个jobRadius
属性。该属性表示用户到任意点的最大距离。
在我的代码中,我需要获取特定点附近的所有用户。 这是我目前正在尝试做的事情:
async getNearbyUsers(point)
const users = await this.model.aggregate([
$geoNear:
near: point,
distanceField: "dist.calculated",
maxDistance: '$settings.jobRadius',
spherical: true
])
return users
此代码不起作用。它总是给我带来集合中的所有用户。
如果我将maxDistance
字段更改为类似的内容,它会起作用:
maxDistance: 1
我的问题是 - 我如何执行这样的聚合,其中最大距离是动态的并且特定于每个用户?
【问题讨论】:
无法在$geoNear
中使用文档字段。这是jira。
@Ashh 还有其他方法可以执行此查询吗?
您可以先使用$geoNear
上方的$geoNear
计算距离dist.calculated
字段,然后可以使用$expr
和$lte
$gte
运算符使用$match
阶段。
【参考方案1】:
好的,在@Ashh 的帮助下,我设法解决了这个问题 我首先计算用户与点之间的距离,然后过滤所有半径属性超过距离的用户。
async getNearbyUsers(point)
const users = await this.model.aggregate([
$geoNear:
near: point,
distanceField: "dist.calculated",
spherical: true
,
$match:
$expr:
$gt: ['$settings.jobRadius', '$dist.calculated']
])
return users
【讨论】:
以上是关于猫鼬地理定位动态最大距离[重复]的主要内容,如果未能解决你的问题,请参考以下文章
JavaScript 地理定位:检查距 2 gps 坐标的距离
HTML5地理位置定位Geolocation-API及Haversine地理空间距离算法