我正在建立一个包含数据的数组,并希望将该数组推送到子文档。

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/

10-12 00:12
查看更多