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

时间:2016-02-01 02:27:15

标签: node.js mongodb mongoose mongodb-query

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

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,则可以正常使用。如果我试图推动阵列,没有任何反应。

2 个答案:

答案 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