将一个数组作为子文档添加到Mongoose模型实例中

我正在构build一个数据的数组,并希望将该数组推到子文档。

var pubArray = []; var count = 5 for (i = 0; i < count; i++) { pubArray.push({publicationName: req.body.publicationName[i], dateSent:req.body.dateSent[i]}); }; Students.findOne({studentNumber: filter}, function (err, student) { student.publications.push({pubArray}); student.save(); }); 

如果我在{publicationName: req.body.publicationName[i], dateSent:req.body.dateSent[i]}使用{publicationName: req.body.publicationName[i], dateSent:req.body.dateSent[i]} ,那么它工作正常。 如果我尝试推动arrays,没有任何反应。

请注意,mogoose中的.push()方法就像JavaScript的等价物一样,它将一个元素“推”到数组上,而不是整个数组。 所以你可以分配整个数组或只是在循环中构造:

  student.publications = pubArray; 

要么:

 // Construct with .push in loop: Students.findOne({ "studentNumber": filter },function(err,student) { for ( var i = 0; i < count: i++ ) { student.publications.push({ "publicationName": req.body.publicationName[i], "dateSent": req.body.dateSent[i] }); } student.save(function(err) { // Complete }); }); 

但是真正的,使用$push的“primefaces”操作符和$push $each直接更新会更好。 然后,这只是一个服务器之旅,而不是两个:

 Students.update( { "studentNumber": filter }, { "$push": { "publications": { "$each": pubArray } } }, function(err,numAffected) { } ); 

这通常比“查找/修改/保存”模式更好,不仅效率更高,而且还避免了潜在的冲突或覆盖数据,因为对象和数组在数据库中就地修改,状态当前到修改时间。

原则上,运营商应始终受益于绩效的好处,以及在修改上没有​​冲突。

student对象的publications属性是一个数组。 您可以简单地将此属性分配给pubArray创build的pubArray

 Students.findOne({studentNumber: filter}, function (err, student) { student.publications = pubArray; student.save(); });