Подтвердить что ты не робот

Как исключить некоторые поля из документа

У меня есть следующая простая shema:

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

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

Что я хочу сделать, это создать новый документ и вернуться к клиенту, но я хочу исключить поле "создатель" из одного:

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: предпочтительнее сделать его

4b9b3361

Ответ 1

Другой способ справиться с этим на уровне схемы - переопределить toJSON для модели.

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

Я столкнулся с этим вопросом, ища способ исключить хеш-пароль из json, который я обслуживал для клиента, и select: false сломал функцию verifyPassword, потому что он вообще не извлекал значение из базы данных.

Ответ 2

Документированный способ

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

Ответ 3

Проходите свой вопрос, когда я пытаюсь найти подобный ответ с pymongo. Оказывается, что в оболочке mongo с вызовом функции find() вы можете передать второй параметр, который указывает, как выглядит документ результатов. Когда вы передаете словарь с значением атрибута равным 0, вы исключаете это поле во всем документе, который выходит из этого запроса.

В вашем случае, например, запрос будет выглядеть следующим образом:

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

Это исключает параметр _creator для вас.

В pymongo функция find() почти такая же. Не уверен, как это перевести на мангуста. Я думаю, что это лучшее решение, сравнимое с ручным удалением полей.

Надеюсь, что это поможет.

Ответ 4

Я бы использовал утилиты 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});
    });
});

Ответ 5

Вы можете вызвать toObject() в документе, чтобы преобразовать его в простой JS-объект, который вы можете свободно изменять:

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

Ответ 6

Я использую Mongoosemask и очень доволен этим.

Он поддерживает скрытие и отображение свойств с другими именами в зависимости от ваших потребностей

https://github.com/mccormicka/mongoosemask

var maskedModel = mongomask.mask(модель, ['name', 'age']);//И все готово.

Ответ 7

Следуя документации MongoDB, вы можете исключить поля, передав второй параметр в свой запрос, например:

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

В этом случае пароль будет исключен из запроса.

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