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"
Não tentei fazer um novo esquema para o autor com seus próprios virtuais. Talvez funcionasse, mas de acordo com outros relatórios de problemas, os subesquemas funcionam perfeitamente em matrizes atm, não como subdocumentos simples.
Olhando para a fonte, isso não parece ser impossível, apenas faltando alguma lógica de divisão inteligente (".") Ao adicionar o virtual à árvore do esquema.
O método get funciona bem por enquanto, mas a outra sintaxe seria preferível. :)
É claro que essa correção também deve ser aplicada a métodos em subdocumentos
E se autor for um array? podemos fazer um virtual em cada um deste array?
Suporte +1 para matrizes
+100 suporte para matrizes
Descobri isso
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]
}
});
A solução acima funciona, mas você também precisará ativar os virtuais para o esquema aninhado:
Variation.set('toJSON', {
virtuals: true
});
Comentários muito úteis
A solução acima funciona, mas você também precisará ativar os virtuais para o esquema aninhado: