如何在MongoDB中位置为空时存储GeoJSON

时间:2018-05-14 00:24:47

标签: mongodb mongoose

如果GeoJSON位置未提供或为空,我如何存储它?我尝试将位置设置为null但它会出现以下错误

  

MongoError:无法提取地理位置密钥:{_ id:ObjectId(' ...'),位置:{coordinates:[]} ...

以下是我使用的代码。

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

1 个答案:

答案 0 :(得分:2)

简单地说,不要设置它。你的mongoose架构可能会加剧这个问题。从MongoDB的角度来看,它并不关心该属性是否根本不存在,并且随后会在索引中忽略它。

当你不想要的时候,实际创造的东西是“猫鼬”,所以如果你不提供任何数据,只需“告诉它”不要包含结构:

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

只要coordinates数组设置为defaultundefined值,那么当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"索引的属性中没有无效数据。