MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

définir les valeurs par défaut sur les tableaux de mangouste dans le nœud js

Mongoose vous permet de "séparer" les définitions de schéma. À la fois pour la "réutilisation" générale et la clarté du code. Donc, une meilleure façon de procéder est :

// general imports
var mongoose = require('mongoose'),
    Schema = mongoose.Schema;

// schema for params
var paramSchema = new Schema({
    "name": { "type": String, "default": "something" },
    "value": { "type": String, "default": "something" }
});

// schema for features
var featureSchema = new Schema({
    "name": { "type": String, "default": "something" }
    "params": [paramSchema]
});

var appSchema = new Schema({
    "appFeatures": [featureSchema]
});

// Export something - or whatever you like
module.export.App = mongoose.model( "App", appSchema );

Il est donc "propre" et "réutilisable" si vous êtes prêt à intégrer les définitions de "Schéma" dans des modules individuels et à utiliser le système "require" pour les importer au besoin. Vous pouvez même "introspecter" les définitions de schéma à partir d'objets "modèles" si vous ne voulez pas tout "moduler".

Cependant, la plupart du temps, cela vous permet de spécifier clairement "ce que vous voulez" pour les valeurs par défaut.

Pour une valeur par défaut plus complexe, vous voudrez probablement le faire dans un crochet "pre save" à la place. Comme exemple plus complet :

var async = require('async'),
    mongoose = require('mongoose'),
    Schema = mongoose.Schema;

var paramSchema = new Schema({
  "name": { "type": String, "default": "something" },
  "value": { "type": String, "default": "something" }
});

var featureSchema = new Schema({
  "name": { "type": String, "default": "something" },
  "params": [paramSchema]
});

var appSchema = new Schema({
  "appFeatures": [featureSchema]
});

appSchema.pre("save",function(next) {
  if ( !this.appFeatures || this.appFeatures.length == 0 ) {
    this.appFeatures = [];
    this.appFeatures.push({
      "name": "something",
      "params": []
    })
  }

  this.appFeatures.forEach(function(feature) {
    if ( !feature.params || feature.params.length == 0 ) {
      feature.params = [];
      feature.params.push(
       {  "name": "a", "value": "A" },
       {  "name": "b", "value": "B" }
      );
    }
  });
  next();
});


var App = mongoose.model( 'App', appSchema );

mongoose.connect('mongodb://localhost/test');


async.series(
  [
    function(callback) {
      App.remove({},function(err,res) {
        if (err) throw err;
        callback(err,res);
      });
    },
    function(callback) {
      var app = new App();
      app.save(function(err,doc) {
        if (err) throw err;
        console.log(
          JSON.stringify( doc, undefined, 4 )
        );
        callback()
      });
    },
    function(callback) {
      App.find({},function(err,docs) {
        if (err) throw err;
        console.log(
          JSON.stringify( docs, undefined, 4 )
        );
        callback();
      });
    }
  ],
  function(err) {
    if (err) throw err;
    console.log("done");
    mongoose.disconnect();
  }
);

Vous pouvez nettoyer cela et inspecter le chemin du schéma pour obtenir les valeurs par défaut à d'autres niveaux. Mais vous voulez essentiellement dire que si ce tableau interne n'est pas défini, vous allez remplir les valeurs par défaut telles qu'elles sont codées.