sql >> Databáze >  >> NoSQL >> MongoDB

Proč moje schéma nepřidává výchozí hodnoty do polí mongoose?

Výchozí hodnoty opravdu nefungují s poli, pokud se samozřejmě nejedná o dokument v poli a nechcete pro tento dokument při přidání do pole nastavit výchozí vlastnost.

Pole je proto vždy inicializováno jako „prázdné“, pokud do něj samozřejmě něco nevložíte. Abyste udělali to, čeho chcete dosáhnout, přidejte háček před uložením, který zkontroluje prázdné pole a poté tam vloží výchozí hodnotu:

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

Což vytvoří hodnotu, kde je prázdná:

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

Pokud samozřejmě inicializujete svá data nebo manipulujete, abyste vytvořili položku v poli:

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

Poté získáte pole, které jste přidali:

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

A pokud jste chtěli mít „vždy“ v oprávněních přítomno „Zobrazit“, pak by to pro vás mohla vynutit podobná změna háku:

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

  next();
});

Což má za následek:

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

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

To jsou způsoby, jak můžete ovládat výchozí hodnoty položek pole, aniž byste je museli explicitně přiřazovat v kódu pomocí modelu.



  1. Jak volat funkci po dokončení asynchronních funkcí uvnitř smyčky?

  2. MongoDB Find Exact Array Match, ale na pořadí nezáleží

  3. Agregační filtr po $lookup

  4. Embedded Redis pro Spring Boot