使用Array参数进行地理空间查询

时间:2015-02-12 17:21:59

标签: mongodb mongoose mongodb-query

有可能吗? 我需要运行查询我的集合多个参数,如数组。它可以是坐标或GeoJSON数组。没关系。

例如

coordinates: [ [3.45855, 18.154265], [4.13515, 22.181822] ]
GeoJSON: [ 
    {"type":"Point", "coordinates":[3.45855, 18.154265]},
    {"type":"Point", "coordinates":[4.13515, 22.181822]},
    {"type":"Point", "coordinates":[5.45833, 24.154888]}   
]

我知道地理空间查询I cannot use $or operator

但我也不能在运营商中使用$。如果我的集合是如下所示的示例文档,我如何使用上述数组之一查询我的集合?

{
    "_id" : ObjectId("54db485b72273a96985dafb7"),
    "firstname" : "John",
    "lastname" : "Doe",
    "location" : {
        "geometry" : {
            "type" : "Point",
            "coordinates" : [ 
                40.937066, 
                29.326202
            ]
        }
    }
}

编辑:

实际上,我需要在我的Array Query中使用$ near和$ maxDistance运算符。我可以找到一个给定的Point参数的结果,如下所示。它有效;

{'location.geometry': 
    { 
        $near: 
        {
            $geometry: GeoJSON[0],
            $maxDistance: 500  
        }
    }
}

但我需要一个如下所示的查询;

{'location.geometry': 
    { 
        $near: 
        {
            $geometry: { $in: GeoJSON },
            $maxDistance: 500  
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我已经使用async javascript library解决了这个问题,如下所示;

    var totalCount = 0
            index = 0;

    async.whilst(
        function(){  
            return index < GeoJSON.length 
        },
        function(callback) { // main function
            var geoQuery = myCollection.find();
            geoQuery.where({
                'location.geometry': {
                    $near: {
                        $geometry: GeoJSON[index],
                        $maxDistance: 500
                    }
                }
            })
            .count(function(err, count){
                if(err) callback(err);
                else {      
                    totalCount += count;
                    index++;
                    callback(null)
                }
            })
        },
        function (err){ // callback function
            res.send({ 
                error: err, 
                count: totalCount 
            })
        }
    );