Mongoose: Prise en charge des virtuels imbriqués, virtuels dans les sous-documents

Créé le 12 févr. 2011  ·  6Commentaires  ·  Source: Automattic/mongoose

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. :)

Commentaire le plus utile

La solution ci-dessus fonctionne, mais vous devrez également activer les virtuals pour le schéma imbriqué :

Variation.set('toJSON', {
    virtuals: true
});

Tous les 6 commentaires

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
});
Cette page vous a été utile?
0 / 5 - 0 notes