MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

ustaw domyślne wartości na tablice mangusty w węźle js

Mongoose pozwala na „oddzielenie” definicji schematów. Zarówno w celu ogólnego „ponownego wykorzystania”, jak i przejrzystości kodu. Lepszym sposobem na to jest:

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

Jest więc „czysty” i „możliwy do ponownego użycia”, jeśli chcesz, aby definicje „schematu” były częścią poszczególnych modułów i używaj systemu „wymagaj” do importowania w razie potrzeby. Możesz nawet "introspekcję" definicji schematu z obiektów "modelu", jeśli nie chcesz "modulować" wszystkiego.

Przeważnie jednak pozwala to wyraźnie określić „co chcesz” dla wartości domyślnych.

W przypadku bardziej złożonego domyślnego przejścia, prawdopodobnie chcesz to zrobić w haku "przed zapisem". Jako pełniejszy przykład:

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

Możesz to wyczyścić i przeprowadzić introspekcję ścieżki schematu, aby uzyskać wartości domyślne na innych poziomach. Ale w zasadzie chcesz powiedzieć, że jeśli ta wewnętrzna tablica nie jest zdefiniowana, wtedy wpiszesz domyślne wartości jako zakodowane.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Skonfiguruj i używaj serwera makiety mongodb do testów jednostkowych

  2. Jak mogę spłaszczyć podwójne tablice w mongoDB?

  3. Jak zwrócić tylko wartość w MongoDB?

  4. Sortuj klucze w obiekcie odpowiedzi z Mongoose w ExpressJS i NodeJS

  5. błąd w monogdb errmsg :WiredTigerIndex::insert:klucz za duży do indeksowania, błąd