sql >> データベース >  >> NoSQL >> MongoDB

ノード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 );
    

    したがって、「スキーマ」定義を個々のモジュールの一部にし、「require」システムを使用して必要に応じてインポートする場合は、「クリーン」で「再利用可能」です。すべてを「モジュール化」したくない場合は、「モデル」オブジェクトからスキーマ定義を「イントロスペクト」することもできます。

    ただし、ほとんどの場合、デフォルトの「必要なもの」を明確に指定できます。

    より複雑なデフォルトスルーの場合は、代わりに「事前保存」フックでこれを実行することをお勧めします。より完全な例として:

    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. mongodbを使用したドル値のフィルタリング

    2. MVC.netのMongoDBからObjectIdを渡す方法

    3. Mongoでは、シャーディングとレプリケーションの違いは何ですか?

    4. Node.js + Mongoose.js注文の合計を取得する方法は、1か月または1週間で行われますか?