Mongoose Geospatial Query查找包含给定点的所有用户球体

时间:2017-03-29 19:22:22

标签: node.js mongodb mongoose mongodb-query geospatial

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

我有一堆用户,他们有一个位置latlng和一个用户定义的半径。 我对位置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。但我真的不知道我怎么读,就像我能找到的一切。我甚至没有找到如何使用mongoose为具有定义半径的2d球体声明模式字段。也许有人可以指出我正确的方向或有一些有用的链接。

1 个答案:

答案 0 :(得分:0)

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

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
    }
);