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具有内置支持,请阅读此内容