0

我的 MongoDB 中存储了一个复杂的 geojson 文档。我的目标是检索适用于我的条件的对象,例如:

我想检索'features.properties.name'字段中包含“avenue”的对象。我试过这个:db.LineString.find({'features.properties.name' : "Avenue"})结果:

在此处输入图像描述

如您所见,这将返回整个文档。我的目标只是返回object 0满足给定条件的突出显示的对象。另外,结果可以以某种方式可视化吗?

4

2 回答 2

0

经过大量研究,我找到了一种实际查询特定对象并使用 RoboMongo 和Google Drag and Drop GeoJSON可视化它们的方法。

对于查询部分,我们可以使用此处指定的以下技术:

//[Thematic]  Finds all the LineString documents that contain “Avenue” in their name.
db.LineString.aggregate(
 { $match : {
     "features.properties.name": /avenue/i
  }},
  { $unwind : "$features" },
  { $match : {
     "features.properties.name": /avenue/i
  }}
)

在这里,我们使用$unwind聚合阶段来定义我们想要检索的字段。之后,我们使用$match来检索具有特定条件的文档。请注意,第一个匹配可以利用索引(文本、空间等)并大大缩短时间。通过右键单击 MongoDB 中的文档,我们可以查看+存储生成的 JSON。

但是,在使用空间数据时,您可能希望将数据放在地图中,尤其是在使用复杂结构时。为此,您需要将数据从JSON 转换为 GeoJSON。下面我将展示我用来转换文件的正则表达式。

算法 JSON 文件(从 MongoDB 生成)到 GeoJSON:

  1. 擦除:"features" : \{.* AND "coordinates"[^}]*\K\} AND "type" : "Feature" AND "ok" : 1.0000000000000000 AND "id".*, **AND** “_id”:ObjectId(.*`
  2. 替换:"type" : "FeatureCollection",[^}]*\} ,WITH "type" : "Feature", "result" : [ "features" : [ { "type": "FeatureCollection", "crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, "features" : [

我使用 Notepad++ 运行这些正则表达式:

  1. "features" : \{.*|"coordinates"[^}]*\K\}|"type" : "Feature"|"ok" : 1.0000000000000000|"id".*,|"_id" : ObjectId\(.*,
  2. "type" : "FeatureCollection",[^}]*\}, 用。。。来代替 "type" : "Feature",

免责声明:请注意,您的文件可能遵循不同的结构,因为您投影数据的方式显然会影响输出文件。在这种情况下,需要进行额外的修改。

现在我们有了 GeoJSON 文件,我们可以将它拖放到Google 的 GeoJSON API中。上述查询将为我们提供名称中包含“Avenue”的温哥华道路:

在此处输入图像描述

想法: 我相信这项工作可以直接从 RoboMongo 完成,因为生成的 JSON 可以通过一些较差的更改转换为 GeoJSON。另请注意,此REGEX太复杂了,如果您对更稳定的解决方案感兴趣,我建议您使用 JSON 库(如NodeJSJackson等)并生成一个全新的文件。我想出了这个解决方案并且它有效非常适合我的情况。

享受 :)

于 2015-10-25T23:12:02.047 回答
0
find(arg1)

您使用的命令返回存储在集合中的文档,因此它可以搜索嵌套文档,但不能返回顶级集合文档的一部分。它返回所有文档。

如果您的文档结构经常尝试使用这个

find(arg1, arg2)

而是限制返回的字段https://docs.mongodb.org/manual/tutorial/project-fields-from-query-results/

如果您的文档结构不规则,请使用您喜欢的编程语言编写脚本

于 2015-10-22T16:39:48.840 回答