MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Pourquoi mon schéma n'ajoute-t-il pas de valeurs par défaut dans les tableaux de mangouste ?

Les valeurs par défaut ne fonctionnent vraiment pas avec les tableaux, à moins bien sûr qu'il s'agisse d'un document dans le tableau et que vous souhaitiez définir une propriété par défaut pour ce document lorsqu'il est ajouté au tableau.

Par conséquent, un tableau est toujours initialisé comme "vide" à moins bien sûr que vous n'y mettiez délibérément quelque chose. Afin de faire ce que vous voulez réaliser, ajoutez un hook de pré-sauvegarde qui recherche un tableau vide, puis y place une valeur par défaut :

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

Ce qui crée la valeur où vide :

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

Si bien sûr vous initialisez vos données ou manipulez pour créer une entrée dans le tableau :

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

Ensuite, vous obtenez le tableau que vous avez ajouté :

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

Et si vous vouliez "toujours" avoir "Afficher" présent dans les autorisations, une modification similaire du crochet pourrait l'appliquer pour vous :

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

  next();
});

Ce qui donne :

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

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

C'est ainsi que vous pouvez contrôler les valeurs par défaut de vos entrées de tableau sans avoir à les affecter explicitement dans votre code à l'aide du modèle.