猫鼬地理定位动态最大距离[重复]

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地理空间距离算法

HTML5地理位置定位Geolocation-API及Haversine地理空间距离算法

使用 $near 和 2d 索引的 Mongo 地理定位不准确