查询文档和可视化中的特定对象 - MongoDB

Querying for specific objects in a document & Visualization - MongoDB

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

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

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

find(arg1)

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

如果您的文档结构正常,请尝试使用此

find(arg1, arg2)

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

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

经过大量研究,我找到了一种使用 RoboMongo 和 Google Drag and Drop GeoJSON.

实际查询特定对象并可视化它们的方法

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

//[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 aggregation stage in order to define what field we want to retrieve. After that we use $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", AND "result" : [ WITH "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",

Disclaimer: Please notice that your file might follow a different structure, since the way you project the data obviously effects the output file. In such a case, extra modification is required.

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

想法: 我相信这项工作可以直接从 RoboMongo 完成,因为生成的 JSON 可以通过一些较差的更改转换为 GeoJSON。另请注意,这个 REGEX is way too complicated and if you are interested in a more stable solution I would suggest you to use a JSON Library like NodeJS, Jackson 等并生成一个全新的 file.I 提出了这个解决方案,它非常适合我的情况。

尽情享受吧:)