2016-07-19 11 views
0

Tut mir leid, wenn das offensichtlich ist, aber ich googelte seit Stunden und das meiste Ergebnis bezieht sich auf Sub-Dokument/geschachtelt-Schema, die für Array von Objekt und nicht mein Fall ist.Wie kann die Validierung eines mongoose Kindelements in einem Schema hinzugefügt werden?

Der Einfachheit halber konstruiere ich nur ein minimales Objekt, aber das Konzept ist das gleiche.

Ich habe ein Mungo-Schema wie folgt, ich will von validateFunction Vater Objekt validieren, die die validateFunction nur prüft, ob Vorname/Name existiert oder nicht:

var PersonSchema = new Schema({ 
    firstName : String, 
    lastName : String, 
    father : { 
    firstName: String, 
    lastName: String 
}, 
    mother : { 
    firstName: String, 
    lastName: String 
} 
}; 

ich versucht habe

var PersonSchema = new Schema({ 
    firstName : String, 
    lastName : String, 
    father : { 
    type: { 
     firstName: String, 
     lastName: String 
    }, 
    validate : validateFunction 
    }, 
    mother : { 
    firstName: String, 
    lastName: String 
    } 
}; 

Das scheint zu funktionieren, aber nach dem Lesen Mongoose Schema Type scheint es, dass der Typ kein gültiger Typ in Mungo ist.

Kann mir jemand den richtigen Weg zeigen, um die Validierung für ein Kindobjekt (Vater) hinzuzufügen?

Hinweis: Ich habe diese SO, die ähnlich ist, aber ich möchte 'Vater' in einer separaten Sammlung nicht speichern, da die Person das einzige Objekt ist, das 'Vater' verwenden, so denke ich Vater so innen sein Objekt "Person"

Edit: Ich @Azeem Vorschlag mit dem folgenden Code haben getestet:

var log = function (val) { 
    console.log(val); 
    return true ; 
} 
var validateFunction = function (val) { 
    if (typeof val === 'undefined') { 
     return false; 
    } 
    console.log(typeof val, val); 
    return true; 
} 
var many = [ 
    { validator: log, msg: 'fail to log' }, 
    { validator: validateFunction, msg: 'object is undefined' } 
]; 
var PersonSchema = new Schema({ 
    firstName : String, 
    lastName : String, 
    father : { 
    firstName: String, 
    lastName: {type : String } 
    validate : many // following http://mongoosejs.com/docs/api.html#schematype_SchemaType-validate 
    }, 
    mother : { 
    firstName: String, 
    lastName: String 
    } 
    }); 

var PersonModel = mongoose.model("PersonTest", PersonSchema); 

var josephus = new PersonModel({firstName:'Josephus', father:{lastName:null}}); 
josephus.save(function(error) { 
    console.log("testing", error); 
}) 

und erhielt Fehler

***/index.js:34 
    validate : many 
    ^^^^^^^^ 
SyntaxError: Unexpected identifier 
    at Module._compile (module.js:439:25) 
    at Object.Module._extensions..js (module.js:474:10) 
    at Module.load (module.js:356:32) 
    at Function.Module._load (module.js:312:12) 
    at Function.Module.runMain (module.js:497:10) 
    at startup (node.js:119:16) 
    at node.js:945:3 

, wenn das Schema auf dem folgenden geändert wird, funktioniert es (unter Beweis stellen von Validate Funktion läuft einwandfrei)

var PersonSchema2 = new Schema({ 
    firstName : String, 
    lastName : String, 
    father : { 
    firstName: String, 
    lastName: {type : String ,validate : many} 

    }, 
    mother : { 
    firstName: String, 
    lastName: String 
    } 
    }); 

Antwort

0

Required Validators On Nested Objects

Mungo docs vorschlägt tatsächlich verschachteltes Schema zu verwenden, so dass wir auf einem Objekt Validierung tun.

var ParentSchema = new Schema({ 
    firstName: String, 
    lastName: String 
}); 
var PersonSchema = new Schema({ 
    firstName : String, 
    lastName : String, 
    father : { 
    type: ParentSchema, 
    validate : validateFunction 
    }, 
    mother : { 
    type: ParentSchema, 
    validate : validateFunction 
    } 
}; 

Dies sollte die Tricks und Validierung tun.

0

Ich habe ein Beispiel wo ich kleine Validierung in meinem Moongoose Schema, hoffe es kann helfen.

var UserType = require('../defines/userType'); 
var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 

//Schema for User 
var UserSchema = new Schema({ 
    name: { 
      type: String, 
      required: true 
    }, 
    email: { 
      type: String 
    }, 
    password: { 
      type: String, 
      required: true 
    }, 
    dob: { 
      type: Date, 
      required: true 
    }, 
    gender: { 
      type: String, // Male/Female 
      required: true 
      default: 'Male' 
    }, 
    type: { 
     type: Number, 
     default: UserType.User 
    }, 

    address:{ 
     streetAddress:{ 
      type: String, 
      required: true 
     }, 
     area:{ 
      type: String 
     }, 
     city:{ 
      type: String, 
      required: true 
     }, 
     state:{ 
      type: String, 
      required: true 
     }, 
     pincode:{ 
      type: String, 
      required: true 
     }, 
    }, 
    lastLocation: { 
     type: [Number], // [<longitude>, <latitude>] 
     index: '2d', // create the geospatial index 
     default: [77.2166672, 28.6314512] 
    }, 
    lastLoginDate: { 
     type: Date, 
     default: Date.now 
    }, 

}); 

//Define the model for User 
var User; 
if(mongoose.models.User) 
    User = mongoose.model('User'); 
else 
    User = mongoose.model('User', UserSchema); 

//Export the User Model 
module.exports = User; 

So können Sie weitere Validierung hinzufügen. In Ihrer Mongo Abfrage, überprüfen nur

db.collection.validate(function(err){ 
    if(err){ 
      console.log(err); //if your validation fails,you can see the error. 
    } 
}); 
+0

danke, tut mir leid, wenn ich meine Frage nicht richtig bin, weiß ich, ich kann Validierung auf dem Blattknoten hinzufügen, ich möchte die Validierung auf dem Elternknoten des Blattes hinzufügen, das ist die 'Adresse' Objekt in Ihrer Probe Code. –

0

try this

var PersonSchema = new Schema({ 
    firstName : String, 
    lastName : String, 
    father : { 
    firstName: String, 
    lastName: String 
    validate : validateFunction 
    }, 
    mother : { 
    firstName: String, 
    lastName: String 
    } 
    }; 
+0

Dank @Azeem Malik, ich habe meine Frage mit Ihrem Vorschlag aktualisiert, scheint nicht funktioniert, indem Sie nur validate dort. –

Verwandte Themen