首页 > 解决方案 > 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 的情况下会更好,我的意思是动态的?

标签: node.jsmongodbexpressmongoose

解决方案


我不想获取所有文档,然后在节点 js 中更新它们,然后分别保存每个文档

为什么不?对我来说似乎是最快的方法。假设 URL 替换需要在每个文档上发生,您为更新它所做的任何操作最终都会要求您保存您修改的每个文档。

db.content.find().forEach(function(e) {
    e.Url = e.Url.replace("/home","/start");
    db.content.save(e);
});

替换时要小心——如果一个 URL 有/home两次会发生什么?

如果您真的反对对整个集合进行查找和更新,则答案概述了如何通过将字符串拆分为单独的字段来使用聚合管道进行此操作。你的旅费可能会改变


推荐阅读