如果GeoJSON位置未提供或为空,我如何存储它?我尝试将位置设置为null但它会出现以下错误
MongoError:无法提取地理位置密钥:{_ id:ObjectId(' ...'),位置:{coordinates:[]} ...
以下是我使用的代码。
if (!data.longitude || !data.latitude) {
data.location = null;
}
else {
data.location = {
type: "Point",
coordinates: [data.longitude, data.latitude]
};
}
答案 0 :(得分:2)
简单地说,不要设置它。你的mongoose架构可能会加剧这个问题。从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"
索引的属性中没有无效数据。