如何使用 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" 中测量。
这是我的猫鼬模式 -
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" 中测量。