Ich habe vor kurzem begonnen, mit MongoDB (Version 3.2.9) zu arbeiten und wollte die Validierungsfunktionen ausprobieren, die es hatte, da ich Konsistenz auf Datenbankebene mag.Validator in MongoDB funktioniert nicht
Ich weiß, ich kann und sollte nur diese Validierung in der Business-Logik, wie ich bereits tun. Aber es fühlt sich gut an, eine zusätzliche Sicherheitsschicht zu haben.
ich versuchte, eine Sammlung category
mit einem _id
vom Typ 'string'
und desc
vom Typ 'string'
'int'
, name
des Typs hinzugefügt wird.
Diese Werte sollten alle vorhanden sein, Einschränkungen für den Inhalt sind jedoch nicht angegeben.
Jetzt, nach den manual ich mit dem folgenden Code am Ende:
jedoch mit dieser einfachen Struktur bereits, MongoDB klagt:
{ "ok" : 0, "errmsg" : "unknown operator: $and", "code" : 2 }
Jetzt, Ich habe this similar question gefunden, aber ging einfach und versuchte, mehrere Einschränkungen direkt in diesetzen 10-Arrays:
db.createCollection('category', {
validator: { $or:
[
{ _id: { $exists: true } },
{ _id: { $type: 'int' } },
{ name: { $exists: true } },
{ name: { $type: 'string' } },
{ desc: { $exists: true } },
{ desc: { $type: 'string' } }
]
}
})
Aber jetzt, während es die Sammlung schafft, wie es sollte, habe ich jetzt eine der folgenden insert
Befehle ausführen können:
db.category.insert({})
db.category.insert({_id: 17, name: '', desc: 'valid'})
db.category.insert({_id: 42, name: 42, desc: ''})
db.category.insert({_id: 43, name: '', desc: 42})
db.category.insert({_id: '', name: 42, desc: 42})
db.category.find()
jetzt kehrt
{ "_id" : ObjectId("57e19650b10ab85eca323684") }
{ "_id" : 17, "name" : "", "desc" : "valid" }
{ "_id" : 42, "name" : 42, "desc" : "" }
{ "_id" : 43, "name" : "", "desc" : 42 }
{ "_id" : "", "name" : 42, "desc" : 42 }
Als letzten Ausweg habe ich versucht, den $or
Operator zu einem $and
zu ändern, da es alle Regeln gültig sein sollte, nicht nur bei mindestens eine.
db.createCollection('category', {
validator: { $and:
[
{ _id: { $exists: true } },
{ _id: { $type: 'int' } },
{ name: { $exists: true } },
{ name: { $type: 'string' } },
{ desc: { $exists: true } },
{ desc: { $type: 'string' } }
]
}
})
Mit diesem Ansatz, der die vernünftigste mir scheint, es funktioniert jedoch nicht bei allen. Unabhängig davon, welche der oben inserts
erwähnt habe ich versucht, mit, Sie daran, es aus der 5 ein gültiges ist, keine funktioniert, alle mir den gleichen Fehler geben:
WriteResult({
"nInserted" : 0,
"writeError" : {
"code" : 121,
"errmsg" : "Document failed validation"
}
})
Wie oben erwähnt, um einen Anruf zu db.version()
kehrt 3.2.9
, und ich verwende die 64-Bit-Standardverteilung von MongoDB auf einem Windows-Computer, wobei nur der Parameter --dbpath
auf ein zuvor leeres Verzeichnis gesetzt ist.