Как сохранить GeoJSON, когда в MongoDB пустое место - PullRequest
0 голосов
/ 14 мая 2018

Как я могу сохранить местоположение GeoJSON, если оно не указано или не заполнено?Я попытался установить для местоположения значение NULL, но выдает следующую ошибку

MongoError: Невозможно извлечь географические ключи: {_id: ObjectId ('...'), местоположение: {координаты: []}...

Ниже приведен код, который я использовал.

if (!data.longitude || !data.latitude) {
    data.location = null;
}
else {
    data.location = {
        type: "Point",
        coordinates: [data.longitude, data.latitude]
    };
}

1 Ответ

0 голосов
/ 14 мая 2018

Проще говоря, не устанавливайте его вообще.Проблема, вероятно, усугубляется вашей схемой мангуста.С точки зрения MongoDB, ему все равно, если свойство просто не существует, и впоследствии будет игнорировать его в индексе.

Это «мангуст», который на самом деле создает вещи, когда вы этого не хотите, так просто«скажите это», чтобы не включать структуру, если вы не предоставили никаких данных:

  location: {
    type: { type: String },
    coordinates: { type: [], default: undefined }
  }

Пока массив coordinates установлен в default для значения undefined, тогда mongooseне пытается добавить «пустой массив» в документ, когда он сохраняется в базе данных, что может вызвать проблемы для индекса.

В качестве полной демонстрации:

const { Schema } = mongoose = require('mongoose');

const uri = 'mongodb://localhost/test';

mongoose.Promise = global.Promise;
mongoose.set('debug', true);

const geoSchema = new Schema({
  name: String,
  location: {
    type: { type: String },
    coordinates: { type: [], default: undefined }
  }
});

const GeoTest = mongoose.model('GeoTest', geoSchema);


const log = data => console.log(JSON.stringify(data, undefined, 2));

(async function() {

  try {

    const conn = await mongoose.connect(uri);

    await Promise.all(Object.entries(conn.models).map(([k,m]) => m.remove()));

    await GeoTest.insertMany([
      {
        "name": "Sydney",
        "location": {
          "type": "Point",
          "coordinates": [
            151.21170043945312,
            -33.86414397991936
          ]
        }
      },
      { "name": "Nowhere" }
    ]);

    let results = await GeoTest.find();
    log(results);

  } catch(e) {
    console.error(e)
  } finally {
    process.exit()
  }

})()

Какойпоказывает сохраненные документы как:

[
  {
    "location": {
      "type": "Point",
      "coordinates": [
        151.21170043945312,
        -33.86414397991936
      ]
    },
    "_id": "5af8e6c17c91d648feb26cc4",
    "name": "Sydney",
    "__v": 0
  },
  {
    "_id": "5af8e6c17c91d648feb26cc5",
    "name": "Nowhere",
    "__v": 0
  }
]

Так что, если вы на самом деле не предоставляете никаких данных location, то там просто ничего нет.Что делает MongoDB счастливым, потому что в свойстве нет недопустимых данных для индексации для "2d" или "2dsphere".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...