次の単純なシーマがあります。
var userSchema = new Schema({
name : String,
age: Number,
_creator: Schema.ObjectId
});
var User = mongoose.model('User',userSchema);
私がやりたいのは、新しいドキュメントを作成してクライアントに戻ることですが、「creator」フィールドを除外したいです:
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
}
マングースへの追加の検索要求なしで作成することは可能ですか?
P.S:作成することが望ましい
文書化された方法は
UserSchema.set('toJSON', {
transform: function(doc, ret, options) {
delete ret.password;
return ret;
}
});
PDATE-ホワイトリストを使用したい場合があります:
UserSchema.set('toJSON', {
transform: function(doc, ret, options) {
var retJson = {
email: ret.email,
registered: ret.registered,
modified: ret.modified
};
return retJson;
}
});
私がpymongoで同様の答えを見つけようとしていたときにあなたの質問に出くわします。 mongoシェルでは、find()関数呼び出しを使用して、結果ドキュメントの外観を指定する2番目のパラメーターを渡すことができます。属性値が0の辞書を渡すと、このクエリから出てくるすべてのドキュメントでこのフィールドが除外されます。
あなたの場合、たとえば、クエリは次のようになります。
db.user.find({an_attr: a_value}, {_creator: 0});
_creatorパラメーターは除外されます。
Pymongoでは、find()関数はほとんど同じです。しかし、それがどのようにマングースに翻訳されるかはわかりません。後でフィールドを手動で削除するよりも優れたソリューションだと思います。
それが役に立てば幸い。
ドキュメントで toObject()
を呼び出して、自由に変更できるプレーンなJSオブジェクトに変換できます。
user = user.toObject();
delete user._creator;
res.json(200, {user: user});
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});
});
});
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}));
この場合、パスワードはクエリから除外されます。
私はMongoosemaskを使用していますが、とても満足しています。
必要に応じて他の名前のプロパティの非表示と公開をサポートします
https://github.com/mccormicka/mongoosemask
var maskedModel = mongomask.mask(model、['name'、 'age']); //これで完了です。