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

Warum fügt mein Schema keine Standardwerte in Mongoose-Arrays hinzu?

Standardwerte funktionieren wirklich nicht mit Arrays, es sei denn natürlich, es handelt sich um ein Dokument innerhalb des Arrays und Sie möchten eine Standardeigenschaft für dieses Dokument festlegen, wenn es dem Array hinzugefügt wird.

Daher wird ein Array immer als "leer" initialisiert, es sei denn, Sie fügen absichtlich etwas hinzu. Um das zu erreichen, was Sie erreichen möchten, fügen Sie dann einen Pre-Save-Hook hinzu, der nach einem leeren Array sucht und dort ansonsten einen Standardwert einfügt:

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

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

var userSchema = new Schema({
  permissions:[{
    "type": String,
    "enum": ["Delete","Show","Create","Update"],
  }]
});

userSchema.pre("save",function(next) {
  if (this.permissions.length == 0)
    this.permissions.push("Show");

  next();
});

var User = mongoose.model( 'User', userSchema );

var user = new User();

user.save(function(err,user) {
  if (err) throw err;
  console.log(user);
});

Was den Wert erzeugt, wo er leer ist:

{ __v: 0,
  _id: 55c2e3142ac7b30d062f9c38,
  permissions: [ 'Show' ] }

Wenn Sie natürlich Ihre Daten initialisieren oder manipulieren, um einen Eintrag im Array zu erstellen:

var user = new User({"permissions":["Create"]});

Dann erhalten Sie das hinzugefügte Array:

{ __v: 0,
  _id: 55c2e409ec7c812b06fb511d,
  permissions: [ 'Create' ] }

Und wenn Sie „immer“ „Show“ in den Berechtigungen haben wollten, dann könnte eine ähnliche Änderung am Hook dies für Sie erzwingen:

userSchema.pre("save",function(next) {
  if (this.permissions.indexOf("Show") == -1)
    this.permissions.push("Show");

  next();
});

Was ergibt:

var user = new User({"permissions":["Create"]});

{ __v: 0,
  _id: 55c2e5052219b44e0648dfea,
  permissions: [ 'Create', 'Show' ] }

Auf diese Weise können Sie die Standardwerte für Ihre Array-Einträge steuern, ohne sie mithilfe des Modells explizit in Ihrem Code zuweisen zu müssen.