Mongoose 地理空间查询查找所有包含给定点的用户球体

Posted

技术标签:

【中文标题】Mongoose 地理空间查询查找所有包含给定点的用户球体【英文标题】:Mongoose Geospatial Query find all User Spheres which include a given point 【发布时间】:2017-08-23 11:12:04 【问题描述】:

我试图找到查询给定场景的正确方法。

我有一群用户,他们有一个位置 latlng 和一个用户定义的半径。 我有一个兴趣点,有一个位置 latlng。 现在我想找到所有用户他们的领域,包括兴趣点的纬度。

我现在告诉你如何查询,但这显然是错误的。

架构:

    const POISchema = new mongoose.Schema(
                                   poi_uuid: type: String, required: true,
                                   category_uuid: type: Number, required: true,
                                   category: type: String, ref: 'SubCategory',
                                   activity: type: String, required: false,
                                   infos: type: String, required: false,
                                   location: 
                                               coordinates: type: [Number], index: '2d', required: false, default: []
                                              
                                           , usePushEach: true); 


    const UserSchema = new mongoose.Schema(
                                   user_uuid: type: String, required: true,
                                   helper_radius: type: Number, required: true,
                                   address: 
                                               coordinates: type: [Number], index: '2d', required: false, default: []
                                             
                                          , usePushEach: true);

查询:

User.find()
                    .and([
                        
                            latlng: 
                                $near: [parseFloat(obj.coordinates[0]), parseFloat(obj.coordinates[1])],
                                $maxDistance: parseFloat(20 / 111.2)
                            
                        ,
                        '_id': '$ne': obj._id,
                        'categories': obj.category_uuid
                    ])
                    .exec(function (err, users) 
                        if (err) 
                            console.log(err);
                            return res.send(500, JSON.stringify(err))
                        
                        return res.send(users: users)
                    )

我知道我可能必须使用 $geoWithin 或 $geoIntersects。但我真的不知道怎么读,我读的就像我能找到的一切。我什至没有找到如何为具有定义半径的 2d 球体声明带有 mongoose 的模式字段。也许有人可以指出我正确的方向或有一些有用的链接。

【问题讨论】:

【参考方案1】:

我认为您正在寻找这样的东西:

var poi; // this is the point of interest for which I want to find the users nearby    
User.aggregate(
    [
         "$geoNear": 
            "near": poi.location.coordinates,
            "distanceField": "distance"
        ,
         "$redact": 
            "$cond": 
                "if":  "$lt": [ "$distance", "$helper_radius" ] ,
                "then": "$$KEEP",
                "else": "$$PRUNE"
            
        
    ],
    function(err,results) 
       // read the response
    
);

【讨论】:

“最大距离”由用户定义,每个人都可以不同。 @Sprotte 能否请您提供用户架构和兴趣点? 现在看看。您必须将聚合框架与 geoNear 管道一起使用。以下是文档:docs.mongodb.com/manual/reference/operator/aggregation/geoNear

以上是关于Mongoose 地理空间查询查找所有包含给定点的用户球体的主要内容,如果未能解决你的问题,请参考以下文章

在给定坐标和最大距离的情况下查找到某个点的最近点 - 使用 Mongoose 和 MEAN 堆栈查询结果未定义

在给定地理点的 50 英尺范围内随机创建一个地理点(空间 SQL)

如何在 Elasticsearch 中查找包含给定点的多边形

如何查询从一个区域到另一个区域的所有空间轨迹

Mongoose Geo Near Search - 如何在给定距离内排序?

点的第 k 个最近邻居的空间查询