var Page = new Schema({
author: {
first_name: String
, last_name: String
}
});
Page.virtual("author.full_name").get(function() {
return this.author.first_name + " " + this.author.last_name;
});
// Later
myPage = new Page({author: {first_name: "John", last_name: "Doe"}});
myPage.author.full_name; // == undefined
myPage.get("author.full_name"); // == "John Doe"
Je n'ai pas essayé de créer un nouveau schéma pour l'auteur avec ses propres virtuels. Peut-être que cela fonctionnerait, mais selon d'autres rapports de problèmes, les sous-schémas fonctionnent de manière optimale dans les tableaux atm, pas comme des sous-documents simples.
En regardant la source, cela ne semble pas impossible, il manque juste une logique intelligente de fractionnement ("".") lors de l'ajout du virtuel à l'arborescence du schéma.
La méthode get fonctionne bien pour le moment, mais l'autre syntaxe serait préférable. :)
Bien sûr, ce correctif doit également être appliqué aux méthodes sur les sous-documents
Et si l'auteur était un tableau ? pouvons-nous faire un virtuel sur chacun de ce tableau?
+1 prise en charge des baies
+100 prise en charge des baies
Compris :.
var Variation = new Schema({
label: {
type: String
}
});
// Virtual must be defined before the subschema is assigned to parent schema
Variation.virtual("name").get(function() {
// Parent is accessible
var parent = this.parent();
return parent.title + ' ' + this.label;
});
var Product = new Schema({
title: {
type: String
}
variations: {
type: [Variation]
}
});
La solution ci-dessus fonctionne, mais vous devrez également activer les virtuals pour le schéma imbriqué :
Variation.set('toJSON', {
virtuals: true
});
Commentaire le plus utile
La solution ci-dessus fonctionne, mais vous devrez également activer les virtuals pour le schéma imbriqué :