如何使用 geoNear 添加更多约束

How to add some more constraints with geoNear

这是我的猫鼬模式 -

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 的特定值?

"best way"是使用MongoDB的$near operator or $nearSphere as required. The .geoNear() method of mongoose uses the older geoNear command。在最新版本中,其他运算符与其他查询运算符的配合更好:

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

});

也可以使用$geoNear的聚合框架形式。这有它自己的 "query" 选项来指定附加信息:

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" 非常相似,它在结果中投射和附加 "distanceField",您可能会用于以后的排序或过滤或其他。

您还应该能够将 "query" 指定为 mongoose 方法的一个选项:

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,像 "maxDistance" 和返回的距离这样的参数是在 "meters" 中测量的,而不是像旧坐标那样在 "radians" 中测量。