Mongodb 如何为mongo db模式定义一个圆?

Mongodb 如何为mongo db模式定义一个圆?,mongodb,mongodb-query,geospatial,Mongodb,Mongodb Query,Geospatial,我有以下代码来定义模式: var mongoose=require('mongoose'); var Schema=mongoose.Schema; var PostSchema=new Schema({ location:{type:Array,required:false,select:true} }) PostSchema.index({location:'2dsphere'}); module.exports=mongoose.model'Post',PostSchema 我想让位置字

我有以下代码来定义模式:

var mongoose=require('mongoose');
var Schema=mongoose.Schema;
var PostSchema=new Schema({
location:{type:Array,required:false,select:true}
})
PostSchema.index({location:'2dsphere'});
module.exports=mongoose.model'Post',PostSchema

我想让位置字段看起来像一个圆圈:位置:{loc:[纬度,经度],半径:radius}..我想做一个查询,从我的数据库中找到与多边形相交的圆。感谢任何帮助:

要对a有效,位置必须按经度,纬度顺序,并且不能包含任何其他坐标

有效格式为

{ 地点:[长,纬度] } 或

{ 位置:{lng:long,lat:lat} } 或GeoJSON

{ 地点:{ 类型:点, 坐标:[长,纬度] } } 另一个字段(如radius)是另一个字段,不能是同一数组的一部分

理想情况下,遵循GeoJSON:

{ 地点:{ 类型:点, 坐标:[长,纬度] }, 半径:半径 } 在mongoose模式定义中,它可以简单到:

var geoSchema=新模式{ 地点:{ 类型:字符串, 坐标:[] }, 半径:数字 }; 在处理真实全球坐标下的地理空间数据时,您的索引应为,您可以在模式中选择将其定义为:

geoSchema.索引{位置:2dsphere} 由于受支持的GeoJSON中不支持圆对象,因此建议保留另一个字段作为半径并存储圆心

与其他传统坐标对格式相比,GeoJSON的最大优势在于,当通过或返回与点的距离时,该距离以米为单位定义。这也是您应该如何定义存储中的任何半径值以保持与该结果一致

对于其他存储格式,结果以弧度返回,对于弧度,您可能希望进行转换,并且不希望将圆的半径存储为测量值

处理此问题的方法是,考虑以下表格中的数据:

{ 位置类型:圆形, 地点:{ 类型:点, 坐标:[1,1] }, 半径:4 } 然后与阶段和过滤器一起使用:

db.collection.aggregate[ //查找附近的点或对象并投影距离 {$geoNear:{ 近:{ 类型:点, 坐标:[2,2] }, 距离字段:距离, 查询:{locationType:circle} }}, //逻辑过滤半径以外的任何内容 {$redact:{ $cond:{ 如果:{$gt:[$distance,$radius]}, 然后:$$PRUNE, 其他:$$KEEP } }} ] 现在,查询示例中使用的值只是一个示例,但如实际经度和纬度坐标所述,距离属性的计算结果与设计一致,并且在前面提到的米公差范围内

这里的要点是,$geoNear将在圆心点附近找到,无论对象类型如何。不仅如此,这里的命令还在生成文档中另一个字段的投影,名为“距离字段”。这表示到圆心的距离(以米为单位)

这里的第二个阶段使用$redact,因为它有点像一个和管道阶段。与$match不同,此运算符可以通过比较文档中的字段来计算逻辑条件。在这种情况下,将匹配的文档移除到if条件(其中为true)并将其从结果中移除,或者移除条件为false的文档

简而言之,如果距离大于圆的半径,则对象位于圆的外部且不相交。否则,它会


这就是为集合中的几何体定义“圆”并使用它实现圆半径内的点或其他类型对象之间的交点的基础。

MongoDB具有内置支持,请阅读此内容