首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用javascript Promises在mongodb中更新多个文档?

如何使用javascript Promises在mongodb中更新多个文档?
EN

Stack Overflow用户
提问于 2016-08-16 22:04:53
回答 1查看 1.2K关注 0票数 0

嗨,我正在写一个更新mongodb数据库的脚本。我的脚本执行以下操作。

  1. 解析文件结构并为目录中的所有文件准备架构对象。然后,它查询数据库并获取数据库中的文件文档。然后,我使用在步骤1和步骤2中准备的数组循环查找合适的方法,即保存或保存

DB。

由于mongodb API的异步特性,我不得不使用Promises。但我不能通过承诺来实现这一点。以下是我的代码。

代码语言:javascript
复制
// a array that stores the file Json objects
var fileJsonArray = [];

//passing the filePath twice as one serves as the source for the icons and the other is the base location.
//Check the documentaion for the file for more details
directoryParser.parseDirectory(...);
//console.log(fileJsonArray);

//connect to db
var mongoose = mongoose || require('mongoose');
mongoose.Promise = require('bluebird');
var dbUrl = 'mongodb://'+ config.dbLocation + ':' + config.dbPort + '/' + config.dbName;
mongoose.connect(dbUrl);

// an array that contains all the promises
var promises = [];
//console.log(fileJsonArray);
//  get all the element
promises.push(File.find({}).exec()
    .catch(function(err){
        console.error('Error while getting all elements',err);
    })
    .then(function(err, allElements) {
        if(err) {
            console.error(err);
        } else {
            console.log(fileJsonArray);

            for (var i = 0; i < fileJsonArray.length; i++) {
                console.log(fileJsonArray[i].name);
                if(fileJsonArray[i] in allElements) {
                    var query = {name : fileJsonArray[i].name, tags: fileJsonArray[i].tags}
                        , update = {size : fileJsonArray[i].size, bmarkedasdeleted: true}
                        , options = {multi: false};
                    promises.push(File.update(query, update, options).exec());
                    allElements.splice(allElements.indexOf(fileJsonArray[i]),1);
                } else {
                    promises.push(fileJsonArray[i].save(function(err) {
                        if(err) {
                            console.error(fileJsonArray, err);
                        }
                    }));
                }
            }

            for (var i = 0; i < allElements.length; i++) {
                var query = {name : allElements[i].name, tags: allElements[i].tags}
                    , update = {bmarkedasdeleted: false}
                    , options = {multi: false};
                promises.push(File.update(query, update, options).exec());
            }
        }
    }));

    //console.log(promises);

    Promise.all(promises).then(function() {
        mongoose.disconnect();
        console.log('Disconnect Mongoose.');
    }).catch(function(err){
        console.log(err);
    });

现在我不能保存任何值,因为find({}).exec()的fileJsonArray是空的。

请给我建议。如果需要澄清,也要添加一些注释。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-26 16:24:40

代码语言:javascript
复制
File.find({}).exec()
    .then((allElements) => {
        var promises = [];
        for (var i = 0; i < fileJsonArray.length; i++) {
            if (fileJsonArray[i] in allElements) {
                var query = {name : fileJsonArray[i].name, tags: fileJsonArray[i].tags}
                    , update = {size : fileJsonArray[i].size, bmarkedasdeleted: true}
                    , options = {multi: false};
                promises.push(File.update(query, update, options).exec());
                allElements.splice(allElements.indexOf(fileJsonArray[i]), 1);
            } else {
                promises.push(fileJsonArray[i].save());
            }
        }

        for (var i = 0; i < allElements.length; i++) {
            var query = {name : allElements[i].name, tags: allElements[i].tags}
                , update = {bmarkedasdeleted: false}
                , options = {multi: false};
            promises.push(File.update(query, update, options).exec());
        }

        return Promise.all(promises);
    }).then(() => {
        mongoose.disconnect();
        console.log('Disconnect Mongoose.');
    }).catch((err) => {
        console.log(err);
    });

因为Promise.all会返回所有已解决的承诺。您应该先执行File.find promise,然后再收集其他promise。请记住,只有在解决了File.find promise之后,您才能获得其他promise。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38977089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档