我发布了一个数组,其中包含这样的名称元素,' [培训1,培训2,培训3]'这些数组元素有自己的' _ids' 。我需要将这些元素的对象_id
保存到另一个具有引用的模型中。
var TrainingNameSchema = new Schema({
trainingname: {
type: String
}
});
var TrainingLevelSchema = new Schema({
levelname: {
type: String
},
trainingnames: [{
type: Schema.Types.ObjectId,
ref: 'TrainingName'
}]
});
我正在使用for循环来保存它,代码如下,
var newLevel = {
levelname: req.body.groupname
};
var levarr = req.body.levtrainingnames;
new TrainingLevel(newLevel)
.save()
.then(function(lev){
for(var i = 0; i<levarr.length; i++){
TrainingName.findOne({
trainingname: levarr[i]
})
.then(function(name){
lev.trainingnames.push(name._id);
console.log(lev);
lev.save()
.then(function(doc){
console.log(doc);
res.redirect('/settings/trainings');
})
.catch(function(err){
console.log(err);
});
})
.catch(function(err){
console.log(err);
});
}
})
.catch(function(err){
console.log(err);
});
当我console.log(doc)
时,其输出正确,
{ trainingnames:
[ 5a64e2dde4dde5080d38c48a,
5a64e49870b92c0834914605,
5a6501807432a00d6873c5f6 ],
_id: 5a66bab1869d0e032e643762,
levelname: 'Level A',
__v: 1 }
但是当我检查数据库时,它会重复自己,请提前帮助,请提供帮助,
"_id" : ObjectId("5a66bab1869d0e032e643762"),
"trainingnames" : [
ObjectId("5a64e2dde4dde5080d38c48a"),
ObjectId("5a64e2dde4dde5080d38c48a"),
ObjectId("5a64e49870b92c0834914605"),
ObjectId("5a6501807432a00d6873c5f6"),
ObjectId("5a64e2dde4dde5080d38c48a"),
ObjectId("5a64e49870b92c0834914605"),
ObjectId("5a6501807432a00d6873c5f6")
],
"levelname" : "Level A",
"__v" : 3
答案 0 :(得分:1)
试试这个,我们每次迭代都需要update
而不是save
new TrainingLevel(newLevel)
.save()
.then(function(lev){
for(var i = 0; i<levarr.length; i++){
TrainingName.findOne({
trainingname: levarr[i]
}).then(function(name){
lev.update({$push : {trainingnames : name._id}}, function(err, doc){
if(err) console.log(err);
console.log(doc);
})
}).catch(function(err){
console.log(err);
});
}
}).catch(function(err){
console.log(err);
}
);
答案 1 :(得分:0)
更好更简单的方法是首先使用训练名称的 insertMany()
一步进行批量插入,然后使用从
用作训练级别模型的写入操作:
const names = req.body.levtrainingnames.map(t => ({ trainingname: t }));
TrainingName.insertMany(names).then(docs => (
new TrainingLevel({
levelname: req.body.groupname,
trainingnames: docs.map(doc => doc._id)
}).save()
)).then(doc => {
console.log(doc);
res.redirect('/settings/trainings');
})