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

查询文档中的特定对象&;可视化-MongoDB,mongodb,geospatial,geojson,robo3t,nosql,Mongodb,Geospatial,Geojson,Robo3t,Nosql,我的MongoDB中存储了一个复杂的geojson文档。我的目标是检索适用于我的条件的对象,例如: 我想在'features.properties.name'字段中检索包含“avenue”的对象。我尝试过:db.LineString.find({'features.properties.name':“Avenue”})结果: 如您所见,这将返回整个文档。我的目标只是返回满足给定条件的对象,如高亮显示的对象0。此外,结果是否可以以某种方式可视化 find(arg1) 命令可以对存储在集合中的文

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

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

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

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

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

find(arg1, arg2)
而是限制返回的字段


如果您的文档结构不规则,请使用您最喜欢的编程语言编写脚本经过大量研究,我找到了一种方法,可以实际查询特定对象并使用RoboMongo和

对于查询部分,我们可以按照规定使用以下技术:

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

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

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

  • 擦除:
    “功能”:\{.*
    坐标[^}]*\K\}
    “类型”:“功能”
    “id”:ObjectId(*`
  • 将“
    ”类型“:”功能集合“,[^}]*\}
    替换为“
    ”类型“:”功能“,
    ”和“
    ”结果“:[
    替换为“
    ”功能“:[
    {
    “类型”:“FeatureCollection”,
    “crs”:{“类型”:“名称”,“属性”:{“名称”:“urn:ogc:def:crs:ogc:1.3:CRS84”},
    “功能”:[
  • 我使用记事本++运行这些正则表达式:

  • “功能”:\{.*}“坐标”[^}]*\K\}|“类型”:“功能”|“确定”:1.0000000000000000 |“id”。*,|“| id”:ObjectId\(.*,
  • “类型”:“功能集合”[^}]*\},
    替换为
    “类型”:“功能”,
  • 免责声明:请注意,您的文件可能采用不同的结构,因为您投影数据的方式明显影响输出文件。在这种情况下,需要进行额外的修改

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

    想法: 我相信这项工作可以直接由RoboMongo完成,因为生成的JSON可以转换为GeoJSON,只需做一些次要的更改。另外,请注意,这太复杂了,如果您对更稳定的解决方案感兴趣,我建议您使用JSON库,如,等等,并生成一个全新的文件。我提出了这一点这个解决方案对我的案子非常有效


    享受:)

    @JohnnyHK$elemMatch和$only只返回第一个匹配项。您有返回所有匹配项的解决方案吗?如果您想要所有匹配项,请参阅使用
    aggregate
    的问题的两个答案。@JohnnyHK非常感谢。我将对其进行更多研究……您知道我是否可以提取结果d文档转换为GeoJSON格式?似乎我可以生成
    JSON
    文档,但不能生成
    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
      }}
    )