#mongodb #mongodb-query
#mongodb #mongodb-запрос
Вопрос:
Существует ли какой-либо строгий режим для индекса геометрии 2dsphere в mongodb?
Может ли mongodb запретить хранение пустых геометрий (пустой список, пустой dict)?
Тестовый пример:
$ mongo
MongoDB shell version v4.0.6
...
> use geotest
switched to db geotest
> db.places.createIndex({'geometry': '2dsphere'})
{
"createdCollectionAutomatically" : true,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
…пока все хорошо.
> db.places.insert({'geometry': [[]]}) // this fails -> good
WriteResult({
"nInserted" : 0,
"writeError" : {
"code" : 16755,
"errmsg" : "Can't extract geo keys: { _id: ObjectId('5c8a483bcebc3f30972cb9ea'), geometry: [ [] ] } Point must only contain numeric elements"
}
})
… очень рад, что это не удается, но это:
> db.places.insert({'geometry': []}) // can I make mongo fail here too?
WriteResult({ "nInserted" : 1 })
> db.places.insert({'geometry': {}}) // and here?
WriteResult({ "nInserted" : 1 })
> db.places.insert({'geometry': null}) // how about this one?
WriteResult({ "nInserted" : 1 })
> db.places.find()
{ "_id" : ObjectId("5c8a4840cebc3f30972cb9eb"), "geometry" : [ ] }
{ "_id" : ObjectId("5c8a4843cebc3f30972cb9ec"), "geometry" : { } }
{ "_id" : ObjectId("5c8a4b23cebc3f30972cb9ee"), "geometry" : null }
…не завершается сбоем. Могу ли я как-то исправить этот сбой?
Комментарии:
Ответ №1:
Спасибо @alex-blex за совет!
Использование средства проверки для новых коллекций:
> db.createCollection("places", {validator: {"geometry.type": {$in:
... ["Point", "MultiPoint", "LineString", "MultiLineString", "Polygon", "MultiPolygon"]
... }}})
{ "ok" : 1 }
> db.places.createIndex({'geometry': '2dsphere'})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
Теперь мы не можем вставлять пустые геометрии:
> db.places.insert({'geometry': []})
WriteResult({
"nInserted" : 0,
"writeError" : {
"code" : 121,
"errmsg" : "Document failed validation"
}
})
> db.places.insert({'geometry': {}})
WriteResult({
"nInserted" : 0,
"writeError" : {
"code" : 121,
"errmsg" : "Document failed validation"
}
})
> db.places.insert({'geometry': null})
WriteResult({
"nInserted" : 0,
"writeError" : {
"code" : 121,
"errmsg" : "Document failed validation"
}
})
Чтобы добавить средство проверки в существующую коллекцию:
> db.places.createIndex({'geometry': '2dsphere'})
{
"createdCollectionAutomatically" : true,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
> db.runCommand({ collMod: 'places', validator: {"geometry.type": {$in:
... ["Point", "MultiPoint", "LineString", "MultiLineString", "Polygon", "MultiPolygon"]
... }}})
{ "ok" : 1 }