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

Perché il mio schema non aggiunge valori predefiniti negli array mongoose?

I valori predefiniti in realtà non funzionano con gli array, a meno che ovviamente non si tratti di un documento all'interno dell'array e tu non voglia impostare una proprietà predefinita per quel documento quando viene aggiunto all'array.

Pertanto un array viene sempre inizializzato come "vuoto" a meno che, ovviamente, non ci si metta qualcosa deliberatamente. Per fare ciò che vuoi ottenere, aggiungi un hook pre-salvataggio che verifica la presenza di un array vuoto e quindi inserisce un valore predefinito lì:

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

Che crea il valore dove vuoto:

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

Se ovviamente inizializzi i tuoi dati o modifichi per creare una voce nell'array:

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

Quindi ottieni l'array che hai aggiunto:

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

E se volevi "sempre" avere "Mostra" presente nelle autorizzazioni, una modifica simile all'hook potrebbe applicarlo per te:

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

  next();
});

Che si traduce in:

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

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

Questi sono i modi in cui puoi controllare i valori predefiniti sulle voci dell'array senza doverli assegnare esplicitamente nel codice utilizzando il modello.