Search code examples
node.jsmongodbgis

Point must only contain numeric elements, instead got type string


enter image description here

I'm working with node (using the MongoClient library) and mongodb, trying to add a geospatial index to my data

The records in my collection have a longitude and latitude field. I understand that in order to create a geospatial index, you need a location field that corresponds to the geoJson point format (https://medium.com/@AbbasPlusPlus/geospatial-data-in-mongodb-storage-indexing-and-queries-1c6db21b7970) . Therefore after inserting the data I run:

async function addLocation() {
  const res = collection.updateMany(
    { location: { $exists: false } }, // filter
    {
      $set: {
        location: {
          type: "Point",
          coordinates: ["$longitude", "$latitude"],
        },
      },
    } 
  );
}

Next, I tried to add a geospatial index with:

async function createIndex() {

  try {

    await collection.createIndex({ location: "2dsphere" });
    console.log('Index created');

  } catch (err) {
    console.error(err);
  }
}

This gives the error in the title

Looking at the records I saw the screenshot. I assume the long, lat fields should have numbers instead of operators.

How can I fix addLocation, so that it puts correct values in the long, lat fields?


Solution

  • to update fields based on values of other fields or if you want to use complex expressions(ex- $map etc) you'll have to use the bracket notation with updates
    see aggregation pipeline with updates

      const res = collection.updateMany(
        { location: { $exists: false } },
        [
         {
          $set: {
            location: {
              type: "Point",
              coordinates: ["$longitude", "$latitude"],
            },
          },
         }
        ] 
      );