Пн goose - добавить значение в поле, скрытое проекцией - PullRequest
0 голосов
/ 06 мая 2020

У меня есть модель документа с видимостью полей, управляемых ролью пользователя. Я хотел бы изменить поле, даже если оно скрыто проекцией.

Вместо использования собственного 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, у которого есть доступ ко всему документу, независимо от проекции.

...