我正在建立一个包含数据的数组,并希望将该数组推送到子文档。
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]}
内使用student.publications.push
,则可以正常工作。如果我尝试推动阵列,则什么也不会发生。 最佳答案
请注意,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
和$each
的“原子”运算符会更好。然后,这只是一次到服务器的旅程,而不是两次:Students.update(
{ "studentNumber": filter },
{ "$push": { "publications": { "$each": pubArray } } },
function(err,numAffected) {
}
);
这通常比“查找/修改/保存”模式更好,并且不仅效率更高,而且还避免了潜在的冲突或覆盖数据,因为对象和数组是在数据库中“就地”修改的,修改时的当前状态。
原子运算符应始终受到青睐,因为它们具有性能优势,并且在修改方面没有冲突。
关于node.js - 将数组作为子文档添加到Mongoose模型实例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35122166/