6

次のスキーマがあります。

var UserSchema = new mongoose.Schema({
  username: {
    type: String,
    unique: true,
    required: true
  },
  password: {
    type: String,
    required: true
  },
  test: {
    type: String, 
    default: 'hello world'
  }
});

UserSchema.pre('save', function(callback) {
  var user = this;
  this.test = undefined; // here unset test field which prevent to add in db 
});

module.exports = mongoose.model('User', UserSchema);

しかし、たとえばデータを見つけたとき

User.find(function(err, users) {
    if (err)
      res.send(err);

    res.json(users);
  });

それはいつも戻ってくる

[
    {
        _id: "56fa6c15a9383e7c0f2e4477",
        username: "abca",
        password: "$2a$05$GkssfHjoZnX8na/QMe79LOwutun1bv2o76gTQsIThnjOTW.sobD/2",
        __v: 0,
        test: "hello world"
    }
]

testフィールドなしでクエリを変更せずにデータを取得するために、特別なパラメータを変更または追加するにはどうすればよいですか。

User.find({}, '-test', function (err, users){

});

また、モデルにデフォルト値を設定しましたtest: "hello world" が、この値を応答に表示したくありません。私も設定this.test = undefined;しましたが、これは、このデフォルト値がデータベースに追加されるのを妨げていることを意味するはずですが、応答としてまだこれを取得しています。

4

3 に答える 3

2
  1. testプロパティをデータベースに保持し、クエリ時に選択したくない場合:

selectpre find フックで使用できます。

UserSchema.pre('find', function (next) {
    this.select({ test: false });
    next();
});

クエリ フックでは (たとえば、保存フックとは対照的に)、thisクエリ オブジェクトを参照します。保存フックでは、現在保存されているドキュメントを参照します。

このフックはクエリに対してのみ実行され、クエリfindに対しては実行されません。findByIdfindOne

また

(ハンク・チウの答えを参照)

スキーマで select フラグを false に設定します。

test: {
      type: String, 
      default: 'hello world',
      select: false,
}
  1. testプロパティをデータベースに永続化したくありません:

スキーマからプロパティを削除し、仮想testを追加します。test

schema.virtual('test').get(function () {
    return 'hello world';
});

user.test戻りhello worldます。

  1. test プロパティをデータベースに保持したいが、何か違うものを返す:

定義を追加しgetterます。test

test: {
    type: String, 
    default: 'hello world',
    get: function () {
        return 'hello guys';
    }
}

user.test戻りhello guysますが、その真の値はデータベースに保持されます。

古い誤った答え:

selectモデル プロパティのオブジェクトをキーとして取り、ブール値を値として取る which を 使用できます。

User
    .find({})
    .select({
        test: false;
    })
    .exec(function (err, users) {
        // users won't have the test property
    });

于 2016-03-29T12:36:17.737 に答える