MongoDB教程

MongoDB教程

本教程演示了如何将app-schema插件与MongoDB数据存储一起使用。本教程将重点介绍MongoDB数据存储的特​​性,强烈建议您先阅读app-schema文档。

用例

本教程的用例是通过app-schema提供有关存储在MongoDB数据库中的某些气象站的信息。请注意,此用例完全是虚构的,仅用于演示MongoDB和app-schema集成。

首先,让我们在MongoDB数据存储中插入一些测试数据:

db.stations.insert({
    "id": "1",
    "name": "station 1",
    "contact": {
        "mail": "[email protected]"
    },
    "geometry": {
        "coordinates": [
            50,
            60
        ],
        "type": "Point"
    },
    "measurements": [
        {
            "name": "temp",
            "unit": "c",
            "values": [
                {
                    "time": 1482146800,
                    "value": 20
                }
            ]
        },
        {
            "name": "wind",
            "unit": "km/h",
            "values": [
                {
                    "time": 1482146833,
                    "value": 155
                }
            ]
        }
    ]
})

db.stations.insert({
    "id": "2",
    "name": "station 2",
    "contact": {
        "mail": "[email protected]"
    },
    "geometry": {
        "coordinates": [
            100,
            -50
        ],
        "type": "Point"
    },
    "measurements": [
        {
            "name": "temp",
            "unit": "c",
            "values": [
                {
                    "time": 1482146911,
                    "value": 35
                },
                {
                    "time": 1482146935,
                    "value": 25
                }
            ]
        },
        {
            "name": "wind",
            "unit": "km/h",
            "values": [
                {
                    "time": 1482146964,
                    "value": 80
                }
            ]
        },
        {
            "name": "pression",
            "unit": "pa",
            "values": [
                {
                    "time": 1482147026,
                    "value": 1019
                },
                {
                    "time": 1482147051,
                    "value": 1015
                }
            ]
        }
    ]
})

db.stations.createIndex({
    "geometry": "2dsphere"
})

这是将用于在app-schema中执行映射的模式:

 

   

   
     
       
     
   

   
     
      < xs:element  ref = “st:Measurement” /> 
     
     
   

   
    
       
       
       
     
   

   
    
       
    
     
   

   
     
       
       
     
   

   
     
       
         
           
           
           
           
         
       
     
   

   
   
   


映射

MongoDB对象可能包含嵌套元素和嵌套集合。以下三个函数可以使用JSON路径选择嵌套元素和链接嵌套集合:

功能 描述
jsonSelect jsonSelect( 'contact.mail') 用于从MongoDB对象检索映射的值。
collectionLink collectionLink( 'measurements.values') 在使用嵌套集合链接实体时使用。
collectionId collectionId() 指示映射器为嵌套集合生成ID。
nestedCollectionLink nestedCollectionLink() 在嵌套集合上使用,以创建与父功能的链接。

站数据由关于站的一些元信息和测量列表组成。每个测量都作为一些元信息并包含一个值列表。映射将包含三个顶部实体:工作站,测量值和值。

遵循完整的映射文件:




  
    st
    http://www.stations.org/1.0
  
  
    gml
    http://www.opengis.net/gml
  



  
    data_source
    
      
        data_store
        mongodb://{mongoHost}:{mongoPort}/{dataBaseName}
      
      
        namespace
        http://www.stations.org/1.0
      
      
        schema_store
        file:{schemaStore}
      
      
        data_store_type
        complex
      
    
  



  
    stations.xsd
  



  
    data_source
    {collectionName}
    st:StationFeature
    
      
        st:StationFeature
        
          jsonSelect('id')
        
      
      
        st:name
        
          jsonSelect('name')
        
      
      
        st:contact/st:mail
        
          jsonSelect('contact.mail')
        
      
      
        st:measurement
        
          collectionLink('measurements')
          aaa
          FEATURE_LINK[1]
        
        true
      
      
        st:geometry
        
          jsonSelect('geometry')
        
      
    
  
  
    data_source
    {collectionName}
    aaa
    st:Measurement
    
      
        st:Measurement
        
          collectionId()
        
      
      
        st:name
        
          jsonSelect('name')
        
      
      
        st:unit
        
          jsonSelect('unit')
        
      
      
        st:values
        
          collectionLink('values')
          st:Value
          FEATURE_LINK[2]
        
        true
      
      
        FEATURE_LINK[1]
        
          nestedCollectionLink()
        
      
    
  
  
    data_source
    {collectionName}
    st:Value
    
      
        st:Value
        
          collectionId()
        
      
      
        st:timestamp
        
          jsonSelect('time')
        
      
      
        st:value
        
          jsonSelect('value')
        
      
      
        FEATURE_LINK[2]
        
          nestedCollectionLink()
        
      
    
  


属性的映射很简单,例如以下映射:

 
     st:contact / st:mail  
     
         jsonSelect('contact.mail') 
     

上面的映射定义了站点的联系人邮件将在JSON路径上可用,contact.mail并且对应的XML架构元素是XPATH st:contact/st:mail

功能链更复杂一点。让我们以链接StationFeatureMeasurement功能为例。在StationFeature要素类型中,使用以下映射定义到Measurement实体的链接:

 
     st:measurement  
     
         collectionLink('measurements') 
         st:Measurement  
         FEATURE_LINK [1]  
     
     true  

Measurement要素类型中,使用以下映射定义父要素的链接:

 
     FEATURE_LINK [1]  
     
         nestedCollectionLink() 
     

通过上面的两个映射,我们将两个要素类型绑定在一起。使用MongoDB数据存储时,此映射将始终小得多,只需要更新嵌套的收集路径和功能链接索引。请注意,嵌套集合属性的JSON路径是相对于父级的。

查询

要在GeoServer中创建MongoDB应用程序架构层,需要安装app-schema扩展和mongo-complex扩展。

需要创建在映射文件中声明的每个名称空间的工作空间,在这种情况下,需要创建st具有URI 的工作空间http://www.stations.org/1.0。无需创建gml工作区。

创建MongoDB应用程序模式层与任何其他应用程序模式层类似,只需创建指向正确映射文件的应用程序模式存储,并选择与顶层实体对应的层,在本例中st:StationFeature

可以使用复杂的功能过滤功能查询使用GML和GeoJson编码的WFS复杂功能。例如,查询具有时间戳的测量值的所有站优于1482146964

 
     
         
             
                     
                        st:StationFeature / st:measurement / st:values / st:timestamp   
                        1482146964     

你可能感兴趣的:(MongoDB)