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

Node.js 使用nodejs在mongodb中保存替换的字符串数据,node.js,mongodb,Node.js,Mongodb,我正在尝试替换url中的字符串。这是它的图像 在这幅图中,我想用pics数组中的lssplprod替换lssplapha。为此,我创建了一个api。这是一个密码 apiRoutes.get('/SchoolListing_lssplalpha_Replace',function(req, res) { schoolListModel.find({},function(err,check){ if(err){ return console.log(err

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

在这幅图中,我想用pics数组中的lssplprod替换lssplapha。为此,我创建了一个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"});           }   
    } 
    }); 
 });
apiRoutes.get('/SchoolListing_lssplalpha_Replace',函数(req,res){schoolListModel.find({},函数(err,check){
如果(错误){
返回console.log(err);
}       
否则{

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

您可以使用更新模型。这允许您在一个命令中向MongoDB服务器发送多个写操作。这比使用create()发送多个独立操作(如)要快,因为使用到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 
        });
    }
});
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 
        });
    });
});

使用Promise API:

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 
        });
    }
});
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 
        });
    });
});

您正在for循环(同步)中运行异步调用model.save()

要使for循环同步,您可以使用异步工作的f或…of循环,也不需要像在代码中那样添加多个检查

尝试下面的代码,它将工作

apiRoutes.get('/SchoolListing_lssplalpha_Replace', function (req, res) {
schoolListModel.find({},function (err, check) {
    if (err) {
        return console.log(err);
    }
    else {
        for (let checkObj of check) {
            let newPicArr=[];
            for (let pic of checkObj.pics) {
                pic = pic.replace("lssplalpha", "lsslprod");
                newPicArr.push(pic);
            }
            checkObj.pics=newPicArr;
            checkObj.save(function (err) {
                if (err) {
                    console.error('ERROR!');
                }
            });     
        }
        return res.json({ status: true, message: "Updated Schools" });
    }
   });
});