node.js - mongodb、mongoose、express、nodejs 使用旧值更新多个文档中的字符串
问题描述
我有一个名为“内容”的集合,其中包含大量这样的文档
{"_id":"5e01043e9fde7f33b8133b2d",
"name":"home",
"documentTypeId":"5df01430600e2258382ffb9c",
"parentContnetId":"",
"active":true,
"published":false,
"Url":"/home",
"dataTypes":[],
"__v":0},
{"_id":"5e01045e9fde7f33b8133b2e",
"name":"subhome",
"documentTypeId":"5df01430600e2258382ffb9c",
"parentContnetId":"",
"active":true,
"published":false,
"Url":"/home/subhome",
"dataTypes":[],
"__v":0},
{"_id":"5e01045e9fde7f33b8133b2d",
"name":"subsubhome",
"documentTypeId":"5df01430600e2258382ffb9c",
"parentContnetId":"",
"active":true,
"published":false,
"Url":"/home/subhome/subsubhome",
"dataTypes":[],
"__v":0},
{"_id":"5e01045e9fde7f33b8133b2a",
"name":"subhome2",
"documentTypeId":"5df01430600e2258382ffb9c",
"parentContnetId":"",
"active":true,
"published":false,
"Url":"/home/subhome2",
"dataTypes":[],
"__v":0},
{"_id":"5e01045e9fde7f33b8133b2b",
"name":"subsubhome",
"documentTypeId":"5df01430600e2258382ffb9c",
"parentContnetId":"",
"active":true,
"published":false,
"Url":"/home/subhome2/subsubhome",
"dataTypes":[],
"__v":0}
我想为所有这些更新 'Url' 字段,所以我想用 '/start' 替换每个 '/home'。我不想获取所有文档,然后在节点 js 中更新它们,然后单独保存每个文档。有什么方法可以更新它们抛出 MongoDB 或 mongoose 在不使用 MongoDB shell 的情况下会更好,我的意思是动态的?
解决方案
我不想获取所有文档,然后在节点 js 中更新它们,然后分别保存每个文档
为什么不?对我来说似乎是最快的方法。假设 URL 替换需要在每个文档上发生,您为更新它所做的任何操作最终都会要求您保存您修改的每个文档。
db.content.find().forEach(function(e) {
e.Url = e.Url.replace("/home","/start");
db.content.save(e);
});
替换时要小心——如果一个 URL 有/home
两次会发生什么?
如果您真的反对对整个集合进行查找和更新,则此答案概述了如何通过将字符串拆分为单独的字段来使用聚合管道进行此操作。你的旅费可能会改变
推荐阅读
- ios - UICollectionReusableView 中的 UIBUtton 操作
- php - Typo3 8.7.19 扩展迁移。错误:无法分析类
- mysql - 通过python脚本执行mysql查询时出错
- java - 带有条件的 SQLITE 随机值/行
- scala - 使用 play framework 管理外部 api 调用的缓存解决方案
- react-native - React-Native 中的线性渐变背景颜色
- gherkin - 在 Cucumber-Gherkins 集成测试的特征文件中并行运行示例
- elasticsearch - 弹性搜索 _count 个查询
- android - Recycler View Sqlite 数据库的问题
- csv - 使用 python 请求自动完成表单填写任务