sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Por qué mi esquema no agrega valores predeterminados en matrices de mongoose?

Los valores predeterminados realmente no funcionan con matrices, a menos que, por supuesto, sea un documento dentro de la matriz y desee establecer una propiedad predeterminada para ese documento cuando se agregue a la matriz.

Por lo tanto, una matriz siempre se inicializa como "vacía", a menos que, por supuesto, coloque algo deliberadamente en ella. Para hacer lo que desea lograr, agregue un enlace de guardado previo que verifique si hay una matriz vacía y luego coloque un valor predeterminado allí:

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

Lo que crea el valor donde está vacío:

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

Si, por supuesto, inicializa sus datos o los manipula para crear una entrada en la matriz:

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

Luego obtienes la matriz que agregaste:

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

Y si quisiera "siempre" tener "Mostrar" presente en los permisos, entonces un cambio similar al gancho podría aplicarlo para usted:

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

  next();
});

Lo que resulta en:

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

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

Esas son las formas en que puede controlar los valores predeterminados en las entradas de su matriz sin necesidad de asignarlos explícitamente en su código usando el modelo.