Node.js + Mongodb(仅限):使用save()函数更新多个文档失败

时间:2018-02-15 04:34:43

标签: mongodb find save nodes

路由器中的edit.js文件:

    router.post('/:id', urlencodedParser, function(req, res) {
        const id = req.params.id;

        // casting validate
        if (id.match(/^[0-9a-fA-F]{24}$/)) {
            if (id != undefined || id != '') {
                // Submit modified album
                album.findById(id, function(err, doc) {
                    // Update related(existed) record with old album info
                    photo.find({"album.catalog": doc.catalog}, function(err, items, next) {
                        // Update each record with new album info
                        items: items.map(function(item) {
                            item.album.title = req.body.title;
                            item.album.catalog = req.body.catalog;
                        })
                        // Try to save the documents above.
                        items.save(); // The problem is here!
                    })
                ...
            }
        }
    });

EDIT js文件应该修改专辑的标题和专辑目录,我已经完成了。不知怎的,我发现专辑是否改变了。一些具有旧专辑信息的记录应该同时更改。所以,我找出所有匹配的记录。而且我不仅正确地发现它们。我成功地为他们分配了新的价值。

现在!这是问题所在。最后一步! 如何正确保存它们??

函数save()不起作用!这是错误:

events.js:137
      throw er; // Unhandled 'error' event
      ^

TypeError: doc.save is not a function

一切顺利,直到

items.save();

那么更新这样的文档的正确方法是什么? 我只是想知道有没有使用额外的lib,如mongoose。

变量列表:
id:req.params.id来自网址。
专辑:一个模特。

{
    catalog: 'sampleCatalog', 
    title: 'sampleTitle'
}

照片:一个模特。

{
    album: {catalog: 'sampleCatalog', title: 'sampleTitle'}
}

doc:匹配的专辑记录。
items:所有带有旧专辑信息的数学照片记录 item:项目中的每条记录。

非常感谢你们!

1 个答案:

答案 0 :(得分:0)

您无需映射每个项目以使用请求的值更新文档。你可以在这里使用更新操作。

router.post('/:id', urlencodedParser, function(req, res) {
    const id = req.params.id;

    // casting validate
    if (id.match(/^[0-9a-fA-F]{24}$/)) {
        if (id != undefined || id != '') {
            // Submit modified album
            album.findById(id, function(err, doc) {
                // Update related(existed) record with old album info
                photo.update(
                     {"album.catalog": doc.catalog}, // filter
                     { $set: { 
                         "album.title" : req.body.title,
                         "album.catalog" : req.body.catalog
                       }
                     }, // update values
                     { multi: true}, // options
                     function(err, result) {
                        console.log(result);

                     }
                )
            ...
        }
    }
});

有关mongoose更新的更多参考,请参阅此处。 http://mongoosejs.com/docs/2.7.x/docs/updating-documents.html

如果您想使用不同的数据更新多个文档,我认为您需要根据此链接单独更新每个数据。 way to update multiple documents with different values

或者

如果你想像你一样保存,那么你需要将doc保存在地图内。

photo.find({"album.catalog": doc.catalog}, function(err, items, next) 
{
    // Update each record with new album info
    items: items.map(function(item) {
        item.album.title = req.body.title;
        item.album.catalog = req.body.catalog;
        item.save(function(err, res) { console.log(res) })
     })
})