猫鼬-子文档数组未保存在父文档中

时间:2019-05-29 16:22:17

标签: node.js mongodb mongoose

我正在尝试使用push()方法将子文档推送到父文档中。 之后,我想保存在其上调用save()方法的父文档。但是结果是一个空数组。

在保存父文档之前,我也曾尝试调用parent.markModified('children'),但这没什么区别。

下面是我的架构和应保存子文档的代码:

模式:

const profileSessionSchema = mongoose.Schema({
    firstName: { type: String, trim:true},
...
   realisations : [realisationSchema],
 });
ProfileSession = mongoose.model('ProfileSession',profileSessionSchema);



const realisationSchema = mongoose.Schema({
   profileId :{ type: mongoose.Schema.Types.ObjectId, ref: 'ProfileSession'},
   ...
   type : { type: String, enum:conf.wallTypes, required:true, default:'classic'},
});
Realisation = mongoose.model('Realisation', realisationSchema);


ProfileSession.create(profileData,function(err,profile){
   for(j=0;j<realisations.length;j++){  // realisations array is not empty
     var r = Realisation(realisations[j])
     r.save(function(a,real){
        profile.realisations.push(real)
     }) 
   }

   profile.markModified('realisations')
   profile.save()
})

配置文件确实是在DB中创建的,但是没有实现子文档。我发现了很多与此相关的主题,而且看来markModified方法应该可以解决问题。但这不是我的事,我也不明白为什么...

感谢您的帮助。 干杯

3 个答案:

答案 0 :(得分:2)

我认为您的for循环迭代太快,无法完成r.save(),然后在实际保存之前调用profile.save()。也许将一些console.log放在r.save()内,然后放在profile.save()上方,这样您就可以看到每个被调用的顺序

答案 1 :(得分:1)

callback won't wait its non-blocking so it will immediately execute profile.save before push anything into array, you should try to save it inside the callback or you should use async/await. I am posting both solution where we will save profile inside of callback and using async/await. I would prefer you using async/await. see both solution below :

within callback:

ProfileSession.create(profileData, function(err, profile) {
  for (j = 0; j < realisations.length; j++) { // realisations array is not empty
    var r = Realisation(realisations[j])
    r.save(function(a, real) {
      profile.realisations.push(real)
      profile.markModified('realisations')
      profile.save()
    })
  }


})

with async/await :

async function foo() {
  let newProfileData = await new ProfileSession(profileData)
  let profile = newProfileData.save();
  for (let j = 0; j < realisations.length; j++) { // realisations array is not empty
    let r = new Realisation(realisations[j])
    let real = await r.save();
    profile.realisations.push(real);
    profile.markModified('realisations')
    profile.save()
  }
}
foo()

答案 2 :(得分:0)

如果您实际上是在尝试创建 new Realisation,则需要使用关键字从架构中创建新模型:

ProfileSession.create(profileData,function(err,profile){
   for(j=0;j<realisations.length;j++){  // realisations array is not empty
     var r = new Realisation(realisations[j])  // <-- use new
     r.save(function(a,real){
        profile.realisations.push(real)
     }) 
   }

   profile.markModified('realisations')
   profile.save()
})