- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个看起来像这样的集合:
{
"_id" : ObjectId("5783051796a90cd8098fc3e0"),
"name" : "Org 1",
"locations" : [
{
"name" : "loc 1",
"_id" : ObjectId("57831ac2febcceaf173e81ab"),
"address" : {
"coordinates" : [
172.6034932,
-43.5333797
]
}
},
{
"name" : "loc 2",
"_id" : ObjectId("5783436dc57b8d6248c9c196"),
"address" : {
"coordinates" : [
172.6034977,
-43.5335158
]
}
},
{
"name" : "loc 3",
"_id" : ObjectId("5783439bc57b8d6248c9c197"),
"address" : {
"coordinates" : [
168.6626435,
-45.0311622
]
}
}
]
}
在 locations.address.coordinates
上有一个 2dsphere
索引
我正在使用 aggreagate
和 geonear
来查询这些文档:
db.organisations.aggregate([
{
$geoNear: {
near: { type: "Point", coordinates: [ 172.6036799 , -43.5335639 ] },
distanceField: "dist.calculated",
maxDistance: 5,
includeLocs: "dist.location",
num: 5,
limit: 200,
spherical: true
}
}
])
此聚合工作正常,我得到了所选区域中至少有 1 个位置的所有文档。问题是,当 1 个文档中有超过 1 个匹配项时,我只想检索相关位置。
MongoDB 能够通过 includeLocs
选项告诉我哪个是最接近的,但这还不够,因为我想要所有详细信息。
至少,如果我有每个位置的距离,我可以稍后在聚合管道上对其进行过滤。使用 distanceField
选项我可以获得整个文档的距离,但不是每个匹配位置的距离
回顾一下:我的目标是找到所有具有至少 1 个匹配位置的文档,并知道位置数组中哪些是相关位置。
有没有办法得到它,还是我对 Mongo 的要求太多了?
最佳答案
鉴于澄清,完全重写了答案。
你是对的,$geoNear必须是第一阶段。解决方法是使用“$unwind”和“$redact”将geoNear提供的匹配位置文档与对应的数组元素进行比较。
测试数据:
db.test.insert({ "locs" : [
{ "name" : "a", "address" : { "type" : "Point", "coordinates" : [ 0, 0 ] } },
{ "name" : "b", "address" : { "type" : "Point", "coordinates" : [ 1, 1 ] } },
{ "name" : "c", "address" : { "type" : "Point", "coordinates" : [ 2, 2 ] } }
]})
db.test.insert({ "locs" : [
{ "name" : "h", "address" : { "type" : "Point", "coordinates" : [ 1.01, 1.01 ] } }
]})
db.test.ensureIndex( { "locs.address" : "2dsphere" } )
查询:
db.test.aggregate([
{ "$geoNear" : { near : { "type" : "Point", "coordinates" : [ 1, 1 ] }, distanceField: "dist.calculated", maxDistance: 5000, includeLocs: "dist.location", num: 5, limit: 200, spherical: true } },
{ "$unwind" : "$locs" },
{ "$redact" : {
"$cond" : {
if : { "$eq" : [ { "$cmp" : [ "$locs.address", "$dist.location" ] }, 0 ] },
then : "$$KEEP",
else : "$$PRUNE"
}
}
}
])
geoNear 阶段将输出带有显示距离和匹配位置字段的“dist”字段的整个文档:
{
"_id" : ObjectId("5786fa0ddeb382a191a43122"),
"locs" : [ { "name" : "h", "address" : { "type" : "Point", "coordinates" : [ 1.01, 1.01 ] } } ],
"dist" : {
"calculated" : 0,
"location" : { "type" : "Point", "coordinates" : [ 1, 1 ] }
}
}
我们$unwind “locs”数组允许访问单个数组元素。 dist 字段被保留。
$redact然后可以使用字段删除地址与 $geoNear 阶段返回的位置不匹配的任何数组元素。
结果:
{
"_id" : ObjectId("5786fa0ddeb382a191a43121"),
"locs" : { "name" : "b", "address" : { "type" : "Point", "coordinates" : [ 1, 1 ] } },
"dist" : { "calculated" : 0, "location" : { "type" : "Point", "coordinates" : [ 1, 1 ] } }
}
{
"_id" : ObjectId("5786fa0ddeb382a191a43122"),
"locs" : { "name" : "h", "address" : { "type" : "Point", "coordinates" : [ 1.01, 1.01 ] } },
"dist" : { "calculated" : 1574.1651198970692, "location" : { "type" : "Point", "coordinates" : [ 1.01, 1.01 ] } }
}
更广泛地说,您可能需要考虑调整数据模型,以便每个文档只包含一个地理空间点。 geoNear提供的距离数据好像只针对单个文档,所以以后如果要按多个文档过滤可能会有问题。
关于MongoDB - $geoNear 在同一文档中有多个匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38339995/
我有一个看起来像这样的集合: { "_id" : ObjectId("5783051796a90cd8098fc3e0"), "name" : "Org 1", "locati
我有一个看起来像这样的集合: { "_id" : ObjectId("5783051796a90cd8098fc3e0"), "name" : "Org 1", "locati
我在 Java 中使用 mongodb 的地理功能,我在运行命令“geoNear”时遇到以下问题: 给定: 名为“GEOENTITIES”的集合,包含 GeoJSON 对象 此集合使用 Java 代码
我有一个名为 test 的集合,我想使用 geoNear 进行查询。 2d 索引设置在字段 loc 上。 我在这里正确使用 db.runCommand 吗? db.open (err, client)
我正在使用 MongoDB 2.6.3 查询大量地理空间数据。具体来说,我正在查询中心位置几公里范围内所有 ping 的数据集,然后按用户标识符折叠它们以计算每个用户有多少 ping。 当然,我为此使
我想根据它们与 2D 空间中多个点的接近程度对我的结果进行排序。 我假设这将通过查询第一点然后根据第二点重新查询/检查这些结果来完成? 也许下面的代码可以更好地解释我想要实现的目标? db.runCo
我有以下数据: { "_id" : ObjectId("55a8c1ba3996c909184d7a22"), "uid" : "1db82e8a-2038-4818-b805-76a
在mongodb中使用geoNear时是否可以添加更多的过滤器?例如,假设我的记录如下所示: { _id: {}, cid: 1, latlon: [ -74.07096147537231, 4
我在记录集合 Mongodb (3.4) 中有文档,如下所示:- { "_id" : ObjectId("592d0c78555a7436b0883960"), "us
我有这个查询: db.places.aggregate([ { "$geoNear" : { "near" : { "type" : "Po
我正在使用 mongoDB 在 Java 应用程序中存储和获取位置相关信息。 我在使用“geoNear”获取数据时遇到异常... 这是存储数据的代码: Document doc = new Docum
我正在 MongoDB 中对我的用户模型执行查询,并希望首先按搜索结果的距离(以公里为单位)(使用 $geoNear 运算符),然后按上次登录时间对搜索结果进行排序。问题是,距离属性以浮点变量中的米形
我的收藏有如下字段,存储用户签到(地理坐标) { "_id" : ObjectId("5333c3063b15ea390b3c986a"), "userID" : "5332cad33
我正在使用 NodeJs 和 Mongoose 并构建一个功能来列出附近的交易。 Deal.db.db.command({ "geoNear": Deal.collection.name
我一直在网上搜索与此相关的内容,但找不到。 我有这个聚合 Place.aggregate( [ { "$geoNear": { "near": {
我在集合 offers 中有以下示例 mongodb 文档。 集合:优惠 { "countryCode" : "LU", "geoLocation" : [ {
我有一个简单的 MongoDo 聚合查询: { "$geoNear": { "near": { "type": "Point",
我在 MongoDB 中有一些地理空间数据,我想找到靠近用户位置并符合特定条件的地点列表。 这是我的文档结构: { "_id" : { "$oid" : "528af043d1a2760efcd2fd
我的文档结构如下: { agency_key : '', route_id: '', direction_id: '', stops: [ {stop_id:15,
我正在开发一个 PHP 应用程序,我们需要在其中检索特定边界内的结果,但按结果的创建日期而不是距离排序。我认为 MongoDB 的 geoNear 命令对此非常有用,因为它负责计算每个结果的距离。但是
我是一名优秀的程序员,十分优秀!