sql >> Databasteknik >  >> NoSQL >> MongoDB

Varför lägger inte mitt schema till standardvärden i mongoose-arrayer?

Standardvärden fungerar verkligen inte med arrayer, såvida det inte är ett dokument inom arrayen och du vill ställa in en standardegenskap för det dokumentet när det läggs till i arrayen.

Därför initieras en array alltid som "tom" såvida du inte medvetet lägger in något i den. För att göra det du vill uppnå, lägg sedan till en pre save hook som letar efter en tom array och sedan placerar ett standardvärde där:

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

Vilket skapar värdet där tomt:

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

Om du naturligtvis initierar din data eller manipulerar för att skapa en post i arrayen:

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

Sedan får du arrayen du lade till:

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

Och om du "alltid" ville ha "Visa" närvarande i behörigheter, kan en liknande ändring av kroken genomdriva det för dig:

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

  next();
});

Vilket resulterar i:

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

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

Det är de sätt du kan styra standardinställningarna på dina arrayposter utan att uttryckligen behöva tilldela dem i din kod med modellen.



  1. Hur man använder Redis sorterade listor

  2. Om redis redan är en del av stacken, varför används Memcached fortfarande tillsammans med Redis?

  3. Hur tillämpar man begränsningar i MongoDB?

  4. Vilka är de underliggande datastrukturerna som används för Redis?