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.