Weder Instanzmethoden, statische Methoden noch virtuelle Daten werden in der Datenbank gespeichert. Der Unterschied zwischen Methoden und virtuellen Objekten besteht darin, dass auf virtuelle Objekte wie Eigenschaften zugegriffen wird und Methoden als ähnliche Funktionen bezeichnet werden. Es gibt keinen Unterschied zwischen instance/static und virtuals, da es keinen Sinn macht, eine virtuelle statische Eigenschaft in der Klasse verfügbar zu haben, aber es macht Sinn, statische Methoden für das Dienstprogramm oder die Factory in der Klasse zu haben.
var PersonSchema = new Schema({
name: {
first: String,
last: String
}
});
PersonSchema.virtual('name.full').get(function() {
return this.name.first + ' ' + this.name.last;
});
var Person = mongoose.model('Person', PersonSchema);
var person = new Person({
name: {
first: 'Alex',
last: 'Ford'
}
});
console.log(person.name.full);
// would print "Alex Ford" to the console
Während Methoden wie normale Funktionen aufgerufen werden.
PersonSchema.method('fullName', function() {
return this.name.first + ' ' + this.name.last;
});
var person = new Person({
name: {
first: 'Alex',
last: 'Ford'
}
});
console.log(person.fullName());
// notice this time you call fullName like a function
können Sie auch „set“ virtuelle Objekte wie Sie mit regelmäßigen Eigenschaften gewohnt sind. Rufen Sie einfach .get
und .set
auf, um die Funktionalität für beide Aktionen einzurichten. Beachten Sie in der .get
geben Sie einen Wert zurück, während in der .set
Sie einen Wert akzeptieren und verwenden Sie, um nicht-virtuelle Eigenschaften in Ihrem Dokument festzulegen.
PersonSchema
.virtual('name.full')
.get(function() {
return this.name.first + ' ' + this.name.last;
})
.set(function (fullName) {
var parts = fullName.split(' ');
this.name.first = parts[0];
this.name.last = parts[1];
});
var person = new Person({
name: {
first: 'Alex',
last: 'Ford'
}
});
console.log(person.name.first);
// would log out "Alex"
person.name.full = 'Billy Bob';
// would set person.name.first and person.name.last appropriately
console.log(person.name.first);
// would log out "Billy"
Sie könnten technisch verwenden Methoden für alles und nie virtuellen Eigenschaften verwenden, aber virtuelle Objekte sind elegant für bestimmte Dinge wie die Beispiele, die ich mit person.name.full
hier gezeigt haben.