从for循环中推出数组并将对象存储到mongoose中,重复这些值

时间:2018-01-23 04:36:18

标签: javascript arrays node.js mongodb mongoose

我发布了一个数组,其中包含这样的名称元素,' [培训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

2 个答案:

答案 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');
})