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

スキーマがマングース配列にデフォルト値を追加しないのはなぜですか?

    もちろん、配列内のドキュメントであり、配列に追加されたときにそのドキュメントのデフォルトプロパティを設定する場合を除いて、デフォルト値は実際には配列では機能しません。

    したがって、もちろん意図的に何かを入れない限り、配列は常に「空」として初期化されます。達成したいことを実行するには、空の配列をチェックする事前保存フックを追加し、それ以外の場合はデフォルト値をそこに配置します。

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

    空の場所に値を作成します:

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

    もちろん、データを初期化するか、操作して配列にエントリを作成する場合:

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

    次に、追加したアレイを取得します:

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

    また、権限に「常に」「表示」を表示したい場合は、フックに同様の変更を加えると、それが強制される可能性があります。

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

    結果は次のようになります:

    var user = new User({"permissions":["Create"]});
    
    { __v: 0,
      _id: 55c2e5052219b44e0648dfea,
      permissions: [ 'Create', 'Show' ] }
    

    これらは、モデルを使用してコードで明示的に割り当てる必要なしに、配列エントリのデフォルトを制御できる方法です。



    1. REDISのクラスター有効オプションでYCSBロードを開始するには

    2. MongoDBスキーマ設計-小さなドキュメントが多いですか、それとも大きなドキュメントが少ないですか?

    3. AngularJsアプリを作成するときのJadeまたはハンドルバーの使用は何ですか

    4. MongoEngineを使用して並べ替えますか?