我正在尝试替换 url 中的字符串。这是它的图像
在此图像中,我想将 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)在数据库中?这是登录控制台的图像
请帮助我走出困境
最佳答案
这里的问题是您正在运行一个 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/