Mongoose Model не сохраняет поле типа `Object`

286
23 июля 2017, 12:25

Хочу сохранить модель после изминений:

Statistic.findOne({ 'user': user, 'type': type })
    .then(function(commonStatistic) {
    commonStatistic.data.words += words.length;
    commonStatistic.data.comments += comments.length;
    commonStatistic.data.visits++;
    commonStatistic.updated = Date.now();
    commonStatistic.save(function (err) {
        if (err) {
            // TODO: Add handler
        }
    });
});

Все поля, кроме поля (объекта) data сохраняются нормально, а дата не хочет ни в какую, что это за бред такой, все поля сохраняет а это нет, это баг или я не правильно что-то делаю?

UPD: Короче как оказалось просто так вложенные объекты не сохраняются, для того что бы они сохранялись при save() нужно, перед сохранением модели, их пометить: commonStatistic.markModified('data');. Мне данное решение помогло, но возможно есть решения лучше?

Answer 1

я бы коротко сделал бы так:

const 
  query = {user, type},
  update = {
    '$inc': {
      'data.words': words.length, 
      'data.comments': comments.length, 
      'data.visits': 1
    },
    '$set': {
       updated: Date.now()
    }
  };
Statistic.update(query, update, callback); 

данный пример не создаст инстанс модели в памяти (экономия))) и изменит 1 документ

если важно иметь под рукой результирующий документ то:

Statistic.findOneAndUpdate(query, update, callback);
READ ALSO
Почему заголовок не моргает?

Почему заголовок не моргает?

Это происходит, потому что вы вместо знака присваивания (=) используете знак сравнения (==)Изменять стиль нужно именно знаком =:

263
if($(window).width()<=800) не работает в Chrome

if($(window).width()<=800) не работает в Chrome

Скрипт гамбургера не работает в Google Chrome, но прекрасно работает в FireFox, если я задаю ему if($(window)width()<=800){}

236
appendTo аналогичные функции в Js?

appendTo аналогичные функции в Js?

Как реализовать на нативном js аналогичную функцию appendTo (jquery) ?

353