如何使用geoNear添加更多约束

时间:2015-01-07 09:16:31

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

这是我的猫鼬模式 -

var userDestinationSchema = mongoose.Schema({

    uid: String,                
    update_time: Date,          
    some_data: String,

    location:{                  //<INDEXED as 2d>
        lon: Number,
        lat: Number
    }
});



var userDestinationModel = mongoose.model('userDestinationModel', userDestinationSchema);

要查询geoNear的模型,我这样做。

userDestinationModel.geoNear(lng, lat, { maxDistance : 1.5 }, 
              function(err, results, stats) {
                   console.log(results);
                });

如何添加更多约束,例如some_data的特定值?

1 个答案:

答案 0 :(得分:1)

&#34;最佳方式&#34;是根据需要使用$near运算符或$nearSphere。 mongoose的.geoNear()方法使用旧的geoNear command MongoDB。其他运算符在最近的版本中与其他查询运算符更好地匹配:

userDestinationModel.find({ 
    "location": {
        "$near": [ lng, lat ],
        "$maxDistance": 1.5
    },
    "update_time": { "$gt": new Date("2015-01-01") }
},function(err,result) {

});

您还可以使用$geoNear的聚合框架表单。这有它自己的&#34;查询&#34;选项以指定其他信息:

userDestinationModel.aggregate(
    [
        { "$geoNear": {
            "near": [ lng, lat ],
            "maxDistance": 1.5,
            "distanceField": "distance",
            "query": {
                "update_time": { "$gt": new Date("2015-01-01") }
            }
        }}
    ],
    function(err,result) {

    }
);

这允许其他选项以及它与项目所在的"command form"和其他&#34; distanceField&#34;在结果中,您可以将其用于以后的排序或过滤等等。

您还应该能够指定&#34;查询&#34;作为猫鼬方法的一个选项:

userDestinationModel.geoNear(lng, lat, 
    { 
        "maxDistance" : 1.5, 
        "query": { 
            "update_time": { "$gt": new Date("2015-01-01") } 
        } 
    }, 
    function(err, results, stats) {
        console.log(results);
    });

但作为个人偏好,除非您依赖于较旧的服务器版本支持,否则我会选择较新的运营商。

同时尝试远离传统的坐标对和GeoJSON,因为它与其他API更加一致,您可能会在数据交换中使用以及支持更多种类的GeoJSON类型。请注意,移动到GeoJSON的参数如&#34; maxDistance&#34;并且返回的距离以&#34;米&#34;而不是&#34;弧度&#34;与传统坐标一样。