2016-09-20 4 views
1

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.

Antwort

1

Bitte geben Sie den 32-Bit-Integer-Wert mit der Funktion NumberInt() an. Ansonsten wird es als Double interpretiert.

Die folgende Einfügung sollte ein Dokument erfolgreich in die Sammlung einfügen.

Erfolgsszenario: -

db.category.insert({_id: NumberInt(17), name: "aaaa", desc: "valid"}) 

Failure Szenario: -

db.category.insert({_id: NumberInt(42), name: 42, desc: ''}) 
Verwandte Themen