sql >> Database >  >> NoSQL >> MongoDB

stel standaardwaarden in op mangoestarrays in node js

Met Mongoose kunt u schemadefinities "scheiden". Zowel voor algemeen "hergebruik" als voor duidelijkheid van code. Dus een betere manier om dit te doen is:

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

Het is dus "schoon" en "herbruikbaar" als u bereid bent om "Schema"-definities onderdeel te maken van afzonderlijke modules en het "vereiste"-systeem te gebruiken om indien nodig te importeren. U kunt zelfs schemadefinities van "model"-objecten "introspecteren" als u niet alles wilt "moduleren".

Meestal kunt u echter duidelijk aangeven "wat u wilt" voor standaardinstellingen.

Voor een meer complexe standaard door, wil je dit waarschijnlijk in plaats daarvan in een "pre save" hook doen. Als een vollediger voorbeeld:

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

Je zou dat kunnen opschonen en het schemapad introspecteren om standaardwaarden op andere niveaus te krijgen. Maar je wilt eigenlijk zeggen dat als die binnenste array niet is gedefinieerd, je de standaardwaarden als gecodeerd gaat invullen.




  1. Verbinding geweigerd door Docker-container

  2. Een woordenboek met polymorfe waarden opslaan in mongoDB met behulp van C #

  3. NodeJS logt alle gebruikerssessies uit

  4. MongoDB 'count()' is erg traag. Hoe verfijnen/werken we ermee?