MongoDB 错误代码 16755 - 无法提取地理键和重复顶点
MongoDB Error Code 16755 - Can't extract geo keys & duplicate vertices
当我尝试在几何 db.polygons.createIndex({"geometry":"2dsphere"})
上创建索引时,它在某个多边形处停止,错误代码为 16755。它表示 Can't extract geo keys
和 Duplicate vertices: 18 and 20
.
因此,进一步检查后,似乎多边形中的 2 个节点靠得很近,甚至重复时会发生这种情况。
然后我在 QGIS 中手动删除这个节点并重试这个过程,却发现有另一个多边形也有同样的问题。
如何解决此问题而不必重复修复多边形 > 上传到 MongoDB > 创建索引的整个过程?有什么方法可以找出有多少多边形存在此问题?
我遇到了类似的问题。我只需要在我的数据集中找到有效记录(我丢弃了具有重复顶点的记录)。
我重命名了collection-
db.myCollection.renameCollection('myCollectionBk')
然后我将原始 collection 中的一条记录添加到新的 collection 中,并将地理空间索引添加到 collection
db.myCollection.insert(db.myCollectionBk.findOne()) // recreate the collection
db.myCollection.createIndex({geometry:"2dsphere"}) // create the index (assumes the geometry on the record is valid)
db.myCollection.remove({}) // remove the record
然后我将有效记录添加到新的collection。
db.myCollectionBk.find().forEach(function(x){
db.myCollection.insert(x);
})
无效记录将被忽略。
在您的情况下,您可能想要获取 WriteResult from your insert,然后查看它是否成功。像
var errors = []
db.myCollectionBk.find().forEach(function(x){
var result = db.myCollection.insert(x);
if (result.writeError) {
errors.push({x._id:result.writeError.errmsg});
}
})
作为另一种选择,查看 this question(我无法让它工作)
所以我所做的是,我首先使用索引创建了集合,然后尝试使用 mongoimport 进行插入,它告诉我有多少成功插入。
> db.someNewCollection.createIndex({"geometry":"2dsphere"})
要将 GeoJSON 插入 MongoDB,我执行了以下操作:
$ jq --compact-output ".features" yourGeoJSON > output.geojson
$ mongoimport --db someDB -c someNewCollection --file "output.geojson" --jsonArray
当我尝试在几何 db.polygons.createIndex({"geometry":"2dsphere"})
上创建索引时,它在某个多边形处停止,错误代码为 16755。它表示 Can't extract geo keys
和 Duplicate vertices: 18 and 20
.
因此,进一步检查后,似乎多边形中的 2 个节点靠得很近,甚至重复时会发生这种情况。
然后我在 QGIS 中手动删除这个节点并重试这个过程,却发现有另一个多边形也有同样的问题。
如何解决此问题而不必重复修复多边形 > 上传到 MongoDB > 创建索引的整个过程?有什么方法可以找出有多少多边形存在此问题?
我遇到了类似的问题。我只需要在我的数据集中找到有效记录(我丢弃了具有重复顶点的记录)。
我重命名了collection-
db.myCollection.renameCollection('myCollectionBk')
然后我将原始 collection 中的一条记录添加到新的 collection 中,并将地理空间索引添加到 collection
db.myCollection.insert(db.myCollectionBk.findOne()) // recreate the collection
db.myCollection.createIndex({geometry:"2dsphere"}) // create the index (assumes the geometry on the record is valid)
db.myCollection.remove({}) // remove the record
然后我将有效记录添加到新的collection。
db.myCollectionBk.find().forEach(function(x){
db.myCollection.insert(x);
})
无效记录将被忽略。
在您的情况下,您可能想要获取 WriteResult from your insert,然后查看它是否成功。像
var errors = []
db.myCollectionBk.find().forEach(function(x){
var result = db.myCollection.insert(x);
if (result.writeError) {
errors.push({x._id:result.writeError.errmsg});
}
})
作为另一种选择,查看 this question(我无法让它工作)
所以我所做的是,我首先使用索引创建了集合,然后尝试使用 mongoimport 进行插入,它告诉我有多少成功插入。
> db.someNewCollection.createIndex({"geometry":"2dsphere"})
要将 GeoJSON 插入 MongoDB,我执行了以下操作:
$ jq --compact-output ".features" yourGeoJSON > output.geojson
$ mongoimport --db someDB -c someNewCollection --file "output.geojson" --jsonArray