查询文档和可视化中的特定对象 - 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:
- 擦除:
"features" : \{.*
AND "coordinates"[^}]*\K\}
AND "type" : "Feature"
AND "ok" : 1.0000000000000000
AND "id".*, **AND**
"_id" : 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",
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 提出了这个解决方案,它非常适合我的情况。
尽情享受吧:)
我的 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:
- 擦除:
"features" : \{.*
AND"coordinates"[^}]*\K\}
AND"type" : "Feature"
AND"ok" : 1.0000000000000000
AND"id".*, **AND**
"_id" : 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",
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 提出了这个解决方案,它非常适合我的情况。
尽情享受吧:)