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

Hvorfor tilføjer mit skema ikke standardværdier i mongoose-arrays?

Standardværdier virker virkelig ikke med arrays, medmindre det selvfølgelig er et dokument i arrayet, og du vil indstille en standardegenskab for det dokument, når det føjes til arrayet.

Derfor initialiseres et array altid som "tomt", medmindre du selvfølgelig bevidst lægger noget i det. For at gøre det, du vil opnå, skal du tilføje en pre save hook, der tjekker for en tom matrix og ellers placerer en standardværdi derinde:

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

Hvilket skaber værdien hvor tom:

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

Hvis du selvfølgelig initialiserer dine data eller manipulerer for at oprette en post i arrayet:

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

Så får du det array, du tilføjede:

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

Og hvis du ville "altid" have "Vis" til stede i tilladelser, så kunne en lignende ændring af krogen håndhæve det for dig:

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

  next();
});

Hvilket resulterer i:

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

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

Det er de måder, hvorpå du kan kontrollere standardindstillingerne på dine array-indgange uden at skulle tildele dem eksplicit i din kode ved hjælp af modellen.



  1. Skal Redigo Redis Pool virkelig være en global variabel?

  2. MongoDB i 2018 - A Year in Review

  3. Hvordan returnerer man kun en del af array i MongoDB?

  4. MongoDB:Opdater hvert dokument på ét felt