我正在尝试使用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
方法应该可以解决问题。但这不是我的事,我也不明白为什么...
感谢您的帮助。 干杯
答案 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()
})