2015-08-05 2 views
7

Я пытаюсь обновить счет на pre hook. Проблема в том, что по какой-то неизвестной причине крюк findOneAndUpdate не имеет доступа к документу, насколько я могу судить.Mongoose pre findOneAndUpdate hook issues

Я хотел бы сделать это:

source.pre('findOneAndUpdate', function (next) { 
    console.log('------------->>>>>> findOneAndUpdate: '); 
    this.objects = this.objects || []; 
    this.people = this.people || []; 
    this.events = this.events || []; 

    this.objectCount = this.objects.length; 
    this.peopleCount = this.people.length; 
    this.eventCount = this.events.length; 

    next(); 
}); 

Но по какой-то причине this в крюке не является документом, его объект запроса, который, кажется, о бесполезен.

Что мне не хватает? Как использовать предварительный крючок для обновления счетчиков на findOneAndUpdate?

ответ

5

В documentation состояния:

запроса промежуточного слоя отличается от документа промежуточного слоя в тонком, но важным способом: в документе промежуточного слоя, this относится к документу обновляется. В промежуточном программном обеспечении запроса mongoose необязательно имеет ссылку на обновляемый документ, поэтому this ссылается на объект , а не на обновляемый документ.

Действие обновления обычно обновляет документ, который существует только в базе данных (это говорит серверу MongoDB: «найти документ X и установить свойство X ценить Z»), так что полный документ не доступен к Mongoose и, следовательно, вы не можете обновить счетчики (для чего требуется доступ, по крайней мере, к массивам, длина которых вы хотите определить).

В стороне: зачем вам в любом случае отделять *Count свойства вашей схемы? Если вы хотите запросить массивы, соответствующие определенному размеру, вы можете напрямую использовать оператор на массивах.

Если вам действительно нужны свойства count, то для каждого обновления вам необходимо отслеживать количество изменений, внесенных вами в каждый из массивов (с точки зрения количества добавленных/удаленных элементов) и использовать оператор $inc для настройки счетчиков.

+0

Подсчеты есть, поэтому я могу вернуть полный список элементов с помощью 'find' и исключить массивы, поскольку я не хочу получать данные, когда возвращаю полный список. Итак, как мне автоматически обновить счет? Для меня предварительный крючок без доступа к документу довольно бессмыслен. – Justin808

+0

@ Justin808, если вы хотите вернуть размеры массива, подумайте об использовании [агрегации] (http://docs.mongodb.org/manual/reference/operator/aggregation/size/). Если вы хотите обновить подсчеты, вам нужно сначала получить полный документ из базы данных, обновить значения, обновить подсчеты (или использовать для этого промежуточное программное обеспечение _document_, например 'pre ('save'))' и сохранить его обратно в базу данных. Вы не можете сделать это в обновлении по причинам, объясняемым. – robertklep

+0

Я думаю, я не понимаю вещь '$ size'. В настоящий момент я делаю 'SourceModel.find ({treeId: treeId}, '-объекты-люди-события, обратные вызовы)'. Где я могу добавить '$ size' туда, чтобы вернуть размер массивов' objects', 'people' и' events'? – Justin808

5

Вы можете сделать smthng так ->

source.pre('findOneAndUpdate', function (next) { 
    console.log('------------->>>>>> findOneAndUpdate: '); 
    this._update.$set.objects = []; 
    this._update.$set.people = []; 
    this._update.$set.events = []; 
    next(); 
}); 

обратить внимание на _update $ установлен потому, что в контексте «это» будет запрос.. Поэтому вы можете легко добавить все, что хотите!

Смежные вопросы