Как исключить некоторые поля из документа
У меня есть следующая простая 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: предпочтительнее сделать его
Ответы
Ответ 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