У меня есть модель документа с видимостью полей, управляемых ролью пользователя. Я хотел бы изменить поле, даже если оно скрыто проекцией.
Вместо использования собственного find()
у меня есть custom_find()
, которое работает в соответствии с ролью пользователя:
var schema = new Schema({
public_field : {type:String},
private_field : [{type:String}] // array of strings
});
// Projections based on role
var admin_projection = {public_field:1, private_field:1};
var owner_projection = {public_field:1};
// create the mongoose model
var model = mongoose.model('Document', schema);
// my custom find
model.my_findById = function(id, role)
{
var projection;
if(role == 'admin')
{ projection = admin_projection; }
else if(role == 'owner')
{ projection = owner_projection; }
return model.findById(id, projection);
}
Теперь, допустим, я использую my_findById(id, 'owner')
, поэтому поле private_field
скрыто. Однако во время этого процесса система должна изменить private_field
, добавив значение в массив. Если я использую my_find({}, 'owner')
, private_field
не определено, поэтому, если я добавлю значение, оно всегда будет первым, теряя все остальные.
Document.my_findById(id, 'owner')
.then(function(doc)
{
doc.private_field.add(something); // <-- this is not the right way
});
Есть ли способ изменить скрытое поле правильно? Мне понадобится что-то вроде schema.method
, у которого есть доступ ко всему документу, независимо от проекции.