66

私は次の単純なシェマを持っています:

 var userSchema = new Schema({
    name : String,
   age: Number,
   _creator: Schema.ObjectId
  });

  var User = mongoose.model('User',userSchema);

私がやりたいのは、新しいドキュメントを作成してクライアントに戻ることですが、「作成者」フィールドを1つから除外したいと思います。

app.post('/example.json', function (req, res) {
   var user = new User({name: 'John', age: 45, _creator: 'some ObjectId'});
   user.save(function (err) {
      if (err) throw err;

      res.json(200, {user: user});     // how to exclude the _creator field?
   });
});

最後に、_creatorフィールドなしで新しく作成されたユーザーを送信します。

{
   name: 'John',
   age: 45
} 

マングースへの追加の検索要求なしで作成することは可能ですか?

PS:によってそれを作ることが好ましい

4

8 に答える 8

80

スキーマレベルでこれを処理する別の方法は、モデルのtoJSONをオーバーライドすることです。

UserSchema.methods.toJSON = function() {
  var obj = this.toObject()
  delete obj.passwordHash
  return obj
}

クライアントに提供したjsonからパスワードハッシュを除外する方法を探しているこの質問に出くわしselect: false、データベースから値をまったく取得しなかったため、verifyPassword関数を壊しました。

于 2012-06-23T06:41:59.000 に答える
62

文書化された方法は

UserSchema.set('toJSON', {
    transform: function(doc, ret, options) {
        delete ret.password;
        return ret;
    }
});

更新-ホワイトリストを使用することをお勧めします。

UserSchema.set('toJSON', {
    transform: function(doc, ret, options) {
        var retJson = {
            email: ret.email,
            registered: ret.registered,
            modified: ret.modified
        };
        return retJson;
    }
});
于 2013-06-12T10:49:37.537 に答える
18

私がpymongoで同様の答えを見つけようとしていたときに、あなたの質問に出くわしました。mongoシェルでは、find()関数呼び出しを使用して、結果ドキュメントがどのように見えるかを指定する2番目のパラメーターを渡すことができることがわかりました。属性の値が0のディクショナリを渡すと、このクエリから得られるすべてのドキュメントでこのフィールドが除外されます。

たとえば、あなたの場合、クエリは次のようになります。

db.user.find({an_attr: a_value}, {_creator: 0});

_creatorパラメータは除外されます。

pymongoでは、find()関数はほとんど同じです。しかし、それがマングースにどのように変換されるかはわかりません。後で手動でフィールドを削除するよりも良い解決策だと思います。

それが役に立てば幸い。

于 2012-11-18T05:39:34.327 に答える
15

lodashユーティリティ.pick()または.omit()

var _ = require('lodash');

app.post('/example.json', function (req, res) {
    var user = new User({name: 'John', age: 45, _creator: 'some ObjectId'});
    user.save(function (err) {
        if (err) throw err;
        // Only get name and age properties
        var userFiltered = _.pick(user.toObject(), ['name', 'age']);
        res.json(200, {user: user});
    });
});

他の例は次のようになります。

var _ = require('lodash');

app.post('/example.json', function (req, res) {
    var user = new User({name: 'John', age: 45, _creator: 'some ObjectId'});
    user.save(function (err) {
        if (err) throw err;
        // Remove _creator property
        var userFiltered = _.omit(user.toObject(), ['_creator']);
        res.json(200, {user: user});
    });
});
于 2014-08-06T04:29:29.363 に答える
14

ドキュメントを呼び出しtoObject()て、自由に変更できるプレーンなJSオブジェクトに変換できます。

user = user.toObject();
delete user._creator;
res.json(200, {user: user});
于 2012-06-22T17:16:35.073 に答える
9

MongoDBのドキュメントに従うことで、次のような2番目のパラメーターをクエリに渡すことでフィールドを除外できます。

User.find({_id: req.user.id}, {password: 0})
        .then(users => {
          res.status(STATUS_OK).json(users);
        })
        .catch(error => res.status(STATUS_NOT_FOUND).json({error: error}));

この場合、パスワードはクエリから除外されます。

フォント:https ://docs.mongodb.com/v2.8/tutorial/project-fields-from-query-results/#return-all-but-the-excluded-field

于 2017-11-22T10:46:19.750 に答える
1

私はMongoosemaskを使用していて、とても満足しています。

必要に応じて、他の名前のプロパティの非表示と公開をサポートします

https://github.com/mccormicka/mongoosemask

var maskedModel = mongomask.mask(model、['name'、'age']); //これで完了です。

于 2014-08-26T19:06:01.423 に答える
0

これは、スキーマファイル自体で実行できます。

// user.js
var userSchema = new Schema({
    name : String,
    age: Number,
   _creator: Schema.ObjectId
  });

userSchema.statics.toClientObject = function (user) {
  const userObject = user?.toObject();
  // Include fields that you want to send
  const clientObject = {
    name: userObject.name,
    age: userObject.age,
  };

  return clientObject;
};

var User = mongoose.model('User',userSchema);

ここで、クライアントに応答するコントローラーメソッドで、次の手順を実行します。

return res.json({
    user: User.toClientObject(YOUR_ENTIRE_USER_DOC),
  });
于 2021-06-23T18:30:15.517 に答える