Search code examples
node.jsgeospatialgeojsoncloudant

Using MapReduce for results of geospatial indexes in Cloudant


I am using a geospatial index in Cloudant for retrieving all documents inside a polygon. Now I want to calculate some basic static values for those documents (e.g. average age and sum of earnings in a region).

Is it possible to query the geo index and then pass the result on to the MapReduce function?

How can I achieve this, preferable inside the database? Can I avoid querying for the document ids inside the polygon first and then sending the retrieved ids for performing the MapReduce (I am working with large data sets)?

What is working so far is querying the index as well as using the view (separately).

My geo index

function (doc) {
  if (doc.geometry && doc.geometry.coordinates) {
    st_index(doc.geometry);
  }
}

My view

function (doc) {
  var beitrag = doc.properties.beitrag;
  var schadenaufwand = doc.schadenaufwand;
  if(beitrag !== null && typeof beitrag === 'number' ) {
      emit(doc._id, doc.properties.beitrag);
  }
}

A sample geoJson document (original data looks similar)

{
  "_id": "01bff77f642fc4249e787d2ded011504",
  "_rev": "1-25a9a1a15939d5b21af3fbcc5c2d6ed1",
  "type": "Feature",
  "geometry": {
    "type": "Point",
    "coordinates": [
      7.2316,
      40.99
    ]
  },
  "properties": {
    "age": 34,
    "earnings": 982.7
  }
}

Solution

  • It seems like it would be a useful feature, but the answer to this is 'no'. The Geo indexer can't perform aggregations over the data.

    I think you'll have to do as you were thinking -- use the returned list of doc ids to distribute the calculation in another map-reduce system.