sql >> Database teknologi >  >> NoSQL >> MongoDB

sæt standardværdier til mongoose-arrays i node js

Mongoose giver dig mulighed for at "adskille" skemadefinitioner. Både for generel "genbrug" og klarhed i koden. Så en bedre måde at gøre dette på er:

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

Så det er "rent" og "genanvendeligt", hvis du er villig til at gøre "Skema"-definitioner til en del af individuelle moduler og bruge "kræver"-systemet til at importere efter behov. Du kan endda "introspektere" skemadefinitioner fra "model"-objekter, hvis du ikke vil "modulere" alt.

For det meste giver det dig dog mulighed for klart at angive "hvad du vil have" for standardindstillinger.

For en mere kompleks standardgennemgang vil du sandsynligvis gøre dette i en "pre save" hook i stedet. Som et mere komplet eksempel:

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

Du kan rydde op i det og introspektere skemastien for at få standardværdier på andre niveauer. Men du vil grundlæggende sige, at hvis det indre array ikke er defineret, så skal du udfylde standardværdierne som kodet.




  1. Kan ikke oprette forbindelse til MongoDB-serveren på Google Compute Engine fra anden VM-instans

  2. C# med mongodb DateTime Convert

  3. Azure Cache/DataCache stil regioner i Redis

  4. Sådan fjerner du TTL-formular MongoDB-samling?