- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我想查询所有包含一个点的多边形的文档,然后针对该结果集,根据该点与文档位置的接近程度对其进行排序。
想象一下,我有一个 friend 数据库,因为我很酷,想看看哪些 friend 在我的范围内并且愿意来玩。 (每个 friend 都有一个约会多边形,这是他们愿意为约会旅行的范围)
对于所有比赛,我希望他们继续根据他的实际地址和它到我的点(这是我的地址)的距离,看看我应该调用哪个 friend ,这样我就可以确定我是否同意他们来从遥远的地方。 (比方说 300 米)
到目前为止,我在下面有一个查询来查找包含我的点的多边形,但我不知道如何包含 mongodb 的 $near 运算符
对于 JSON:
{
"_id" : "objid",
"FRIEND_NAME" : "Bobby",
"GEOMETRY" : {
"type":"Polygon",
"coordinates":[[
[-73.98779153823898,40.718233223261],
[-74.004946447098,40.723575517498],
[-74.006771211624,40.730592217474],
[-73.99010896682698,40.746712376146],
[-73.973135948181,40.73974615047701],
[-73.975120782852,40.736128627654],
[-73.973997695541,40.730787341083],
[-73.983317613602,40.716639396436],
[-73.98779153823898,40.718233223261]
]]},
"FRIEND_POSITON" : {"lon" : -73.992188, "lat" : 40.729359 }
}
这个有效:
db.friends.find({
"PLAYDATE_RANGE":{
"$geoIntersects":{
"$geometry":{
"type":"Point",
"coordinates":[-73.98652, 40.752044]
}
}
}
})
这不是:
db.friends.find([
{
"PLAYDATE_RANGE":{
"$geoIntersects":{
"$geometry":{
"type":"Point",
"coordinates":[-73.98652, 40.752044]
}
}
}
},
{
"FRIEND_POSITON":{
"$geoNear":{
"near":{
"type":"Point",
"coordinates": [-73.98652, 40.752044]
},
"maxDistance":300
}
}
}
])
请帮助我解决上述无效的查询。
最佳答案
这需要一个 aggregate pipeline .根据 mogodb doc for $geoNear ,您只能使用 $geoNear 作为管道的第一阶段。聚合函数有一个附加查询条目,多边形查询将用于根据包含在文档的 PLAYDATE_RANGE 字段中的内容缩小结果范围。
db.friends.aggregate([
{
$geoNear: {
near: { type: "Point", coordinates: [-73.98652, 40.752044] },
maxDistance: 300,
distanceField: "friends.calculated_distance",
query: {
"PLAYDATE_RANGE": {
"$geoIntersects": {
"$geometry": {
"type": "Point",
"coordinates":[-73.98652, 40.752044]
}
}
}
},
spherical: true
}
}
])
附言请注意,只能使用一个地理空间索引,因此请将其放在 FRIEND_POSITION 字段中。如果添加需要正确格式的 GeoJSON 值的 2sphere 索引,具体而言,
“FRIEND_POSITION”:{“类型”:“点”,“坐标”:[-73.992188,40.729359]}
所以文档应该是这样的:
{
"_id" : "objid",
"FRIEND_NAME" : "Bobby",
"GEOMETRY" : {
"type": "Polygon",
"coordinates":[[
[-73.98779153823898,40.718233223261],
[-74.004946447098,40.723575517498],
[-74.006771211624,40.730592217474],
[-73.99010896682698,40.746712376146,
[-73.973135948181,40.73974615047701],
[-73.975120782852,40.736128627654],
[-73.973997695541,40.730787341083],
[-73.983317613602,40.716639396436],
[-73.98779153823898,40.718233223261]
]]},
"FRIEND_POSITION" : {
"type" : "Point",
"coordinates" : [ -73.992188, 40.729359 ]
}
}
关于MongoDB:在一个查询中使用 $geoIntersects 或 $geoWithin 和 $near,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27710082/
我有一个集合,其属性为“place”,如下所示。 "place" : { "name" : "Central Region", "country" : "Country_A",
我从金奈和类加罗尔城市的谷歌地图中手动获取坐标并插入到我的数据库中。对于类加罗尔市,$geoIntersect 工作得很好。然而,出于某种原因,对于钦奈市,它没有出现。我不确定我在哪里/错过了什么。在
我有一个名为 search2 的集合,其中包含大约 20000 个这样的文档: { "loc": { "type": "Polygon", "c
我有一个 Mongo 集合,我正在尝试对其执行 $geoIntersects 查询。 mongo中的数据格式为: { "_id" : ObjectId, "created_at" :
mongoDB 中的$geoWithin 和$geoIntersects 运算符有什么区别? 如果我正在寻找坐标(使用默认坐标引用系统),$geoWithin 和 $geoIntersects 将返回
我有一个 MongoDB 数据库,其中包含一个名为 fooCollection 的集合。该集合中包含以边界多边形方式包含地理空间数据的文档。我在我的应用程序中使用 C# MongoDB 驱动程序。我注
我有一个包含文档的集合,每个文档都有一个带有多边形的字段数组。 我想测试我的多边形是否与这些多边形中的任何一个相交。如果有帮助的话,它们都是盒子形状的。 如果您添加将我的多边形包含在我正在测试的数组中
我在一个集合中有事件,每个事件都包含一个所需的位置,设置一个 GeoJSON 多边形。 我在另一个集合中也有服务提供商,也有一个 GeoJSON 多边形,指示他们可以交付的区域。 对于给定的服务提供商
我在 2dsphere 索引集合中插入一个点,并试图在多边形中找到它: c = db.foo; c.ensureIndex({'value.geometry': '2dsphere'}); c.ins
我正在使用 Sinatra 和 mongoid 驱动程序,现在我正在尝试在 mongoid 中执行此查询,实际上我有一个名为 'geometry 的地理空间(多边形)字段': db.states.fi
我正在尝试查找符合我的条件的社区 - boundries 多边形与帖子的坐标相交,但我无法做到 - 无法使用 let in我的 管道 $match 帖子实体示例: { _id: ObjectId,
我想查询所有包含一个点的多边形的文档,然后针对该结果集,根据该点与文档位置的接近程度对其进行排序。 想象一下,我有一个 friend 数据库,因为我很酷,想看看哪些 friend 在我的范围内并且愿意
我有一个使用 MongoDb 的 Java 应用程序(客户端版本 3.12)。Filters.geoIntersects 从 Java 应用程序不返回任何内容从 Robo 3T 查询相同的数据时会返回
我是一名优秀的程序员,十分优秀!