MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Por que meu esquema não adiciona valores padrão em matrizes de mangusto?


Os valores padrão realmente não funcionam com matrizes, a menos que seja um documento dentro da matriz e você queira definir uma propriedade padrão para esse documento quando adicionado à matriz.

Portanto, um array é sempre inicializado como "vazio", a menos que você coloque algo nele deliberadamente. Para fazer o que você deseja alcançar, adicione um gancho pré-salvamento que verifique se há uma matriz vazia e, de outra forma, coloque um valor padrão 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);
});

O que cria o valor onde vazio:
{ __v: 0,
  _id: 55c2e3142ac7b30d062f9c38,
  permissions: [ 'Show' ] }

Se, claro, você inicializar seus dados ou manipular para criar uma entrada no array:
var user = new User({"permissions":["Create"]});

Então você obtém o array que você adicionou:
{ __v: 0,
  _id: 55c2e409ec7c812b06fb511d,
  permissions: [ 'Create' ] }

E se você quisesse "sempre" ter "Mostrar" presente nas permissões, uma alteração semelhante no gancho poderia impor isso para você:
userSchema.pre("save",function(next) {
  if (this.permissions.indexOf("Show") == -1)
    this.permissions.push("Show");

  next();
});

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

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

Essas são as maneiras pelas quais você pode controlar os padrões em suas entradas de matriz sem precisar atribuí-los explicitamente em seu código usando o modelo.