MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Legen Sie Standardwerte für Mongoose-Arrays in node js fest

Mongoose ermöglicht es Ihnen, Schemadefinitionen zu "trennen". Sowohl für die allgemeine "Wiederverwendung" als auch für die Klarheit des Codes. Ein besserer Weg, dies zu tun, ist also:

// 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 );

Es ist also „sauber“ und „wiederverwendbar“, wenn Sie bereit sind, „Schema“-Definitionen zu einem Teil einzelner Module zu machen und das „Require“-System zum Importieren nach Bedarf zu verwenden. Sie können sogar Schemadefinitionen von "Modell"-Objekten "introspektieren", wenn Sie nicht alles "modulieren" möchten.

Meistens erlaubt es Ihnen jedoch, "was Sie wollen" für die Standardeinstellungen klar zu spezifizieren.

Für ein komplexeres Standard-Through möchten Sie dies wahrscheinlich stattdessen in einem "Pre-Save"-Hook tun. Als vollständigeres Beispiel:

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();
  }
);

Sie könnten das bereinigen und den Schemapfad überprüfen, um Standardwerte auf anderen Ebenen zu erhalten. Aber Sie möchten im Grunde sagen, wenn dieses innere Array nicht definiert ist, dann werden Sie die Standardwerte wie codiert ausfüllen.