web-dev-qa-db-ja.com

ドキュメントから一部のフィールドを除外する方法

次の単純なシーマがあります。

 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:作成することが望ましい

55
Erik

文書化された方法は

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

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

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

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

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

Pymongoでは、find()関数はほとんど同じです。しかし、それがどのようにマングースに翻訳されるかはわかりません。後でフィールドを手動で削除するよりも優れたソリューションだと思います。

それが役に立てば幸い。

17
Rex

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

user = user.toObject();
delete user._creator;
res.json(200, {user: user});
12
JohnnyHK

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

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

5
Leo Ribeiro

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

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

https://github.com/mccormicka/mongoosemask

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

1
fino