我正在构建一个包含数据的数组,并希望将该数组推送到子文档。
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
,则可以正常使用。如果我试图推动阵列,没有任何反应。
答案 0 :(得分:1)
请注意,mogoose中的.push()
方法与其等效的JavaScript相同,因为它是&#34;推送&#34;数组上的单个元素,而不是整个数组。所以你可以分配整个数组,也可以只在循环中构造:
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
});
});
但是你真的会更好地使用&#34; atomic&#34; $push
的运营商,$each
直接更新。这只是一次服务器之旅,而不是两次:
Students.update(
{ "studentNumber": filter },
{ "$push": { "publications": { "$each": pubArray } } },
function(err,numAffected) {
}
);
这通常比&#34;查找/修改/保存&#34;更好。模式,不仅在提高效率,而且还避免了潜在的冲突或覆盖数据,因为对象和数组被修改&#34;就地&#34;在数据库中,状态是当前的修改时间。
应始终优先考虑原子操作员的性能优势以及修改中没有冲突。
答案 1 :(得分:0)
Ninety_Nine_Bottles_Of_Beer_On_The_Wall
对象的publications
属性是一个数组。您只需将此属性分配给之前创建的student
:
pubArray