MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

задайте стойности по подразбиране на mongoose масиви във възел js

Mongoose ви позволява да "разделяте" дефинициите на схемата. Както за обща „повторна употреба“, така и за яснота на кода. Така че по-добрият начин да направите това е:

// general imports
var mongoose = require('mongoose'),
    Schema = mongoose.Schema;

// schema for params
var paramSchema = new Schema({
    "name": { "type": String, "default": "something" },
    "value": { "type": String, "default": "something" }
});

// schema for features
var featureSchema = new Schema({
    "name": { "type": String, "default": "something" }
    "params": [paramSchema]
});

var appSchema = new Schema({
    "appFeatures": [featureSchema]
});

// Export something - or whatever you like
module.export.App = mongoose.model( "App", appSchema );

Така че е „чист“ и „повторно използваем“, ако желаете да направите дефинициите на „Схема“ част от отделни модули и да използвате системата „изискване“ за импортиране според нуждите. Можете дори да „интроспектирате“ дефиниции на схеми от „моделни“ обекти, ако не искате да „модулирате“ всичко.

Най-вече обаче ви позволява ясно да посочите „какво искате“ за настройки по подразбиране.

За по-сложно преминаване по подразбиране, вероятно искате да направите това в "предварително записване" вместо това. Като по-пълен пример:

var async = require('async'),
    mongoose = require('mongoose'),
    Schema = mongoose.Schema;

var paramSchema = new Schema({
  "name": { "type": String, "default": "something" },
  "value": { "type": String, "default": "something" }
});

var featureSchema = new Schema({
  "name": { "type": String, "default": "something" },
  "params": [paramSchema]
});

var appSchema = new Schema({
  "appFeatures": [featureSchema]
});

appSchema.pre("save",function(next) {
  if ( !this.appFeatures || this.appFeatures.length == 0 ) {
    this.appFeatures = [];
    this.appFeatures.push({
      "name": "something",
      "params": []
    })
  }

  this.appFeatures.forEach(function(feature) {
    if ( !feature.params || feature.params.length == 0 ) {
      feature.params = [];
      feature.params.push(
       {  "name": "a", "value": "A" },
       {  "name": "b", "value": "B" }
      );
    }
  });
  next();
});


var App = mongoose.model( 'App', appSchema );

mongoose.connect('mongodb://localhost/test');


async.series(
  [
    function(callback) {
      App.remove({},function(err,res) {
        if (err) throw err;
        callback(err,res);
      });
    },
    function(callback) {
      var app = new App();
      app.save(function(err,doc) {
        if (err) throw err;
        console.log(
          JSON.stringify( doc, undefined, 4 )
        );
        callback()
      });
    },
    function(callback) {
      App.find({},function(err,docs) {
        if (err) throw err;
        console.log(
          JSON.stringify( docs, undefined, 4 )
        );
        callback();
      });
    }
  ],
  function(err) {
    if (err) throw err;
    console.log("done");
    mongoose.disconnect();
  }
);

Можете да изчистите това и да прегледате пътя на схемата, за да получите стойности по подразбиране на други нива. Но всъщност искате да кажете, че ако този вътрешен масив не е дефиниран, тогава ще попълните стойностите по подразбиране, както са кодирани.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Съхранявайте данни за местоположение в документ Mongodb

  2. Фатална грешка:Клас 'MongoDB\Driver\Manager' не е намерен

  3. Вмъкване на Java обект в MongoDB колекция с помощта на Java

  4. Актуализиране на препратка заедно с други стойности Mongoose

  5. Групово upsert с драйвер MongoDB Java 3.0