node.js - 使用nodejs在mongodb中保存替换的字符串数据

标签 node.js mongodb

我正在尝试替换 url 中的字符串。这是它的图像

enter image description here

在此图像中,我想将 pics 数组中的 lssplalpha 替换为 lssplprod 。为此我创建了一个 api 。这是代码

apiRoutes.get('/SchoolListing_lssplalpha_Replace',function(req, res) { schoolListModel.find({},function(err,check){     
    if(err){        
    return console.log(err); 
        }       
    else{
        for(var i=0;i<check.length;){
            var f=0;
        for(var j=0;j<check[i].pics.length;j++){
               f++;                     
        var newTitle =  check[i].pics[j].replace("lssplalpha","lsslprod");    
         check[i].pics[j] = newTitle; 
         console.log("after change",check[i].pics[j]);
         check[i].save(function (err) {
                if(err) {
                    console.error('ERROR!');
                }
            }); 
}    
if(j==check[i].pics.length&&j==f){  
    i++; 
}       
 } 
console.log("i value",i);
 console.log("check length",check.length); 
if(i==check.length){        
            return res.json({status:true,message:"Updated Schools"});           }   
    } 
    }); 
 });

我收到成功回复。当我去检查数据库时,数据库中没有任何变化。要知道我写日志的原因。当我看到日志时,它正在正确替换。但我不明白为什么这些没有反射(reflect)在数据库中?这是登录控制台的图像 enter image description here

请帮助我走出困境

最佳答案

这里的问题是您正在运行一个 for 循环(同步),您正在调用异步的 model.save() 操作,并且循环不断迭代,但异步调用的结果稍后出现。将数据库项目保存到数组中的过程需要一些时间,Node.js 知道这一点,因此它开始更新,然后继续尝试更新数组中的下一个项目。一旦写入操作完成,就会运行回调函数,但此时循环已完成,无法知道哪些项目以什么顺序完成。

您可以使用Bulk Write API更新您的模型。这允许您通过一个命令向 MongoDB 服务器发送多个写入操作。这比发送多个独立操作(例如,如果您使用 create())更快),因为使用 bulkWrite() 与 MongoDB 之间只有一次往返。

以下示例展示了如何使用bulkWrite。

使用异步/等待:

apiRoutes.get('/SchoolListing_lssplalpha_Replace', async (req, res) => { 

    try {
        let ops = [];
        const docs = await schoolListModel.find({}).lean().exec();

        docs.forEach(doc => {
            const pics = doc.pics.map(pic => pic.replace("lssplalpha", "lsslprod"));

            ops.push({
                "updateOne": {
                    "filter": { "_id": doc._id },
                    "update": {
                        "$set": { pics }
                    }
                }
            });                    
        });     

        const result = await schoolListModel.bulkWrite(ops);  

        console.log('Bulk update complete.', result); 
        res.status(200).json({
            status: true,
            message: "Updated Schools"
        }); 

    } catch (err) {
        res.status(400).send({
            status: false,
            message: err 
        });
    }
});
<小时/>

使用 Promise API:

const bulkUpdate = (Model, query) => (    
    new Promise((resolve, reject) => {
        let ops = [];

        Model.find(query).lean().exec((err, docs) => {
            if (err) return reject(err);

            docs.forEach(doc => {
                const pics = doc.pics.map(pic => (
                    pic.replace("lssplalpha", "lsslprod")
                ));

                ops.push({
                    "updateOne": {
                        "filter": { "_id": doc._id },
                        "update": {
                            "$set": { pics }
                        }
                    }
                });

                if (ops.length === 500) {
                    Model.bulkWrite(ops).then((err, result) => {
                        if (err) return reject(err);                        
                        ops = [];
                        resolve(result);
                    });
                }                       
            });     

            if (ops.length > 0) {            
                Model.bulkWrite(ops).then((err, result) => {
                    if (err) return reject(err);
                    resolve(result);
                });         
            }           
        });     
    })
);

apiRoutes.get('/SchoolListing_lssplalpha_Replace', (req, res) => { 
    bulkUpdate(schoolListModel, {}).then(result => {
        console.log('Bulk update complete.', result); 
        res.status(200).json({
            status: true,
            message: "Updated Schools"
        });    
    }).catch(err => {
        res.status(400).send({
            status: false,
            message: err 
        });
    });
});

关于node.js - 使用nodejs在mongodb中保存替换的字符串数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51769131/

相关文章:

node.js - 我可以使用服务器端生成的 token 将文件上传到客户端的谷歌驱动器(angularjs)

angularjs - 使用注入(inject)时,ng-file-upload 不适用于 MEAN.JS 应用程序

node.js - ReactJS的环境设置

mongodb - 使用 Robomongo 连接到 Windows Azure VM 上的 mongoDB 服务器

java - 使用 Tasklet 在 Spring Batch 中或在 CompositeItemWriter 中创建逻辑?

mongodb - 删除所有为空的字段

java - 使用其他 JSON 对象过滤 JSON 中的键和值

node.js - Mongoose API 文档中的 # 代表什么?

node.js - 在 NodeJS 上为 Watson Conversation 配置 HTTPS

javascript - 在 Node、Express With Multer 中上传之前验证图像宽度和高度