如何获取在其半径内包含给定位置的记录?蒙古数据库
Posted
技术标签:
【中文标题】如何获取在其半径内包含给定位置的记录?蒙古数据库【英文标题】:How to get the records which contains the given location in its radius? Mongodb 【发布时间】:2017-04-13 20:20:17 【问题描述】:我的 DB Mongoose 架构如下所示。
var blogSchema = mongoose.Schema(
blogText: type: String,
location: type: [Number],
radius : type: Number,
);
blogSchema.index(location: 2dsphere);
... .. .. ...
示例数据如下所示
"_id" : 58ef3f1919f99e3bb37ce21b,
"location" : [
77.706106,
12.9447252
],
"radius" : "4000",
"blogText" : "News 1 .....",
"_id" : 58ef3f19b37ce21b19f99e3b,
"location" : [
77.709979,
12.9703882
],
"radius" : "1000",
"blogText" : "Health 1 .....",
"_id" : 58ef3f1919f99e3bb37ce21b,
"location" :[
77.7060119,
12.9488936
],
"radius" : "3500",
"blogText" : "Lifestyle 1 .....",
"_id" : 58ef3f1919f99e3bb37ce21b',
"location" : [
77.709979,
12.9703882
],
"radius" : "100",
"blogText" : "Sports.....",
"_id" : 58ef3f1919f99e3bb37ce21b',
"location" : [
77.706106,
12.9447252
],
"radius" : "800",
"blogText" : "Tech ....."
我只需要获取那些在博客位置和半径下包含用户位置的博客。
我的查询看起来像。它根据请求的位置和半径获取数据。
db.blogs.find(location: $geoNear: $geometry: type: "Point",coordinates: [77.706106,12.9447252]$maxDistance: 500,$minDistance: 0 )
提前致谢
【问题讨论】:
【参考方案1】:从这里修改为answer,这可能对你有用。
使用聚合通过具有三个阶段的管道推送文档。
1)$geoNear
:查找所需坐标附近的所有文档,并返回生成的distanceField
,称为distance
。
2) $project
:使用在第 1 阶段找到的 $distance
并从 $radius
中减去,存储为增量。
3)$match
:过滤掉所有小于或等于0的delta。
db.blogs.aggregate([
'$geoNear' :
near : [77.706106,12.9447252],
distanceField : 'distance',
includeLocs: 'location',
spherical : true
,
'$project' :
name : 1,
location : 1,
delta :
'$subtract' : [
'$radius',
'$distance'
]
,
'$match' :
delta : '$gte' : 0
])
【讨论】:
你是对的,我错误地更改了一个字段的名称。上面是固定的。 现在不能从字符串中减去一个 numberdouble。 我没有意识到您将半径存储为字符串。也可能有一种方法可以投影,但最佳做法是将半径存储为 int 或 float。 我将其存储为数字,您可以看到架构半径:type: Number 我不知道 mongoose orm,但如果您的示例数据正确,那么您的半径将被存储为字符串。以上是关于如何获取在其半径内包含给定位置的记录?蒙古数据库的主要内容,如果未能解决你的问题,请参考以下文章