2014-02-01 2 views
0

У меня есть модель Мангуст, которая выглядит следующим образом:Только первый суб-документ добавлен к модели MongoDB

var ProjectSchema = new Schema({ 
    name: String, 
    slug: String, 
    dateCreated: { type: Date, default: new Date() }, 
    dateUpdated: { type: Date, default: new Date() }, 
    createdByUserId: Schema.Types.ObjectId, 
    screens: [Schema.Types.Mixed] 
}); 

У меня есть метод класса, который выглядит следующим образом:

ProjectSchema.statics.saveElementProperties = function(slugName, screenIndex, elementId, props, callback) { 
    var Project = mongoose.model('Project'); 

    var updateProject = function(project) { 
     // Init empty objects if missing 
     project.screens[screenIndex] = project.screens[screenIndex] || {}; 
     project.screens[screenIndex].elements = project.screens[screenIndex].elements || {}; 
     project.screens[screenIndex].elements[elementId] = project.screens[screenIndex].elements[elementId] || {}; 
     // Apply properties 
     project.screens[screenIndex].elements[elementId] = "Dummy Project Data"; 
     console.log('elements before save:', project.screens[screenIndex].elements); 
     project.save(callback); 
    }; 

    Project.findOne({ slug: slugName }, function(err, project) { 
     if (!project) { 
      project = new Project({ name: slugName, slug: slugName }); 
     } 
     updateProject(project); 
    }); 
}; 

Это происходит, когда Я называю метод saveElementProperties:

  1. В первый раз, когда я запускаю этот метод, он работает так, как должен; новый объект добавляется к project.screens[screenIndex].elements как во время выполнения (элементы 'перед сохранением:' оператор журнала), так и при проверке базы данных MongoDB с клиентом mongo.
  2. Во второй раз второй объект добавляется к project.screens[screenIndex].elements во время выполнения, но этот объект никогда не сохраняется в MongoDB.
  3. В третий раз объекты 1 и 3 видны в project.screens[screenIndex].elements во время выполнения, но третий объект никогда не сохраняется в MongoDB.

В чем причина этого поведения?

MAJOR UPDATE: Я переписал весь механизм персистенции работать менее часто, и вместо того, чтобы заменить весь project.screens[screenIndex].elements объект с обновленной структурой:

ProjectSchema.statics.saveScreenProperties = function(slugName, screenIndex, elements, callback) { 
    console.log('saveScreenProperties:', slugName, screenIndex); 
    var Project = mongoose.model('Project'); 

    var updateProject = function(project) { 
     // Init empty objects if missing 
     project.screens[screenIndex] = project.screens[screenIndex] || {}; 
     project.screens[screenIndex].elements = elements; 
     // Mark as modified and save 
     project.markModified('screens.' + screenIndex); 
     project.save(callback); 
    }; 

    Project.findOne({ slug: slugName }, function(err, project) { 
     if (!project) { 
      project = new Project({ name: slugName, slug: slugName }); 
      console.log(' creating new project'); 
     } 
     updateProject(project); 
    }); 
}; 

Тем не менее, по-прежнему показывает такое же поведение - это магазины начальный объект elements, но не позднее его изменения.

+1

Вы смотрели на 'markModified' на документах? http://mongoosejs.com/docs/api.html#document_Document-markModified Изменения не будут сохраняться, если Mongoose не знал, что они произошли. – WiredPrairie

+0

@WiredPrairie Спасибо, я попробовал с добавлением 'project.markModified ('screens.0');' и даже 'project.markModified ('screens');', но без изменений. –

+0

@WiredPrairie: см. Обновление вопроса, включая мое использование 'markModified'. –

ответ

0

Проблема в том, что вы манипулируете объектами так же, как и в стандартном коде, но mongoose не является «механизмом персистентности», это ODM. Таким образом, вам необходимо использовать предоставленные методы для обновления хранилища данных.

Вам нужно будет использовать операторы обновления для $ push на массив. У Mongoose есть и аналогичные методы. Наиболее объяснительные документы находятся на сайте MongoDB.

http://docs.mongodb.org/manual/reference/operator/update-array/

http://docs.mongodb.org/manual/reference/operator/update/

http://docs.mongodb.org/manual/reference/method/db.collection.update/#db.collection.update

+0

Спасибо! Я переписал механизм сохранения (см. Обновленный вопрос выше) и теперь нужно сохранить модифицированный объект 'elements', но он не сохраняется. Любые подсказки? –

+0

Вам нужно ** нажимать **, как я сказал в ответ. У Мангуста есть также метод. Также посмотрите на [populate] (http://mongoosejs.com/docs/api.html#model_Model.populate) в документах. –

+0

Я беру это обратно - код выше на самом деле работает. Благодаря! –

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