我的MongoDB中存储了一个复杂的geojson文档。我的目标是检索适用于我的条件的对象,例如:
我想要检索包含" avenue"的对象。在'features.properties.name'
字段中。我试过这个:db.LineString.find({'features.properties.name' : "Avenue"})
结果:
如您所见,这将返回整个文档。我的目标只是返回满足给定条件的突出显示的object 0
之类的对象。此外,结果可以以某种方式可视化吗?
答案 0 :(得分:0)
find(arg1)
命令使用带有存储在集合中的文档的返回,因此它可以搜索嵌套的文档,但不能返回顶级集合文档的一部分。它返回所有文档。
如果您的文档结构经常尝试使用此
find(arg1, arg2)
而是限制返回的字段https://docs.mongodb.org/manual/tutorial/project-fields-from-query-results/
如果您的文档结构不规则,请使用您喜欢的编程语言编写脚本
答案 1 :(得分:0)
经过大量研究,我发现了一种实际查询特定对象并使用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聚合阶段来定义我们想要检索的字段。之后,我们使用$match来检索具有特定条件的文档。请注意,第一个匹配可以利用索引(文本,空间等...)并将时间固定很多。通过右键单击MongoDB中的文档,我们可以查看+存储生成的JSON。
但是,使用Spatial数据时,您可能希望将数据放在地图中,尤其是在处理复杂结构时。为此,您需要将数据从 JSON转换为GeoJSON 。下面我将展示我用来转换文件的正则表达式。
算法JSON文件(从MongoDB生成)到GeoJSON:
"features" : \{.*
AND "coordinates"[^}]*\K\}
AND "type" : "Feature"
AND "ok" : 1.0000000000000000
< strong> AND "id".*, **AND**
&#34; _id&#34; :ObjectId(。*`"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 ++运行这些正则表达式:
"features" : \{.*|"coordinates"[^}]*\K\}|"type" : "Feature"|"ok" : 1.0000000000000000|"id".*,|"_id" : ObjectId\(.*,
"type" : "FeatureCollection",[^}]*\},
替换为 "type" : "Feature",
免责声明:请注意,您的文件可能遵循不同的结构,因为您投影数据的方式显然会影响输出文件。在这种情况下,需要进行额外的修改。
现在我们有了GeoJSON文件,我们可以将其拖放到Google's GeoJSON API。以上问题将为我们提供包含&#34; Avenue&#34;在他们的名字上:
<强>思想:强> 我相信这项工作可以直接从RoboMongo完成,因为生成的JSON可以转换为GeoJSON,但有一些较差的变化。另请注意,此REGEX过于复杂,如果您对更稳定的解决方案感兴趣,我建议您使用NodeJS,Jackson等JSON库并生成品牌新文件。我提出了这个解决方案,它完全符合我的情况。
享受:)