Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
替换MongoDB中所有文档中字段中出现的所有子字符串_Mongodb_Mongodb Query - Fatal编程技术网

替换MongoDB中所有文档中字段中出现的所有子字符串

替换MongoDB中所有文档中字段中出现的所有子字符串,mongodb,mongodb-query,Mongodb,Mongodb Query,我有一个集合品牌,我必须替换路径./assets/to D:/data/db/images,我在多个文档中多次出现过这种情况。如何使用查询来实现这一点 每份文件的样本 {"name":"Dell","images":["./assets/dell1.jpg","./assets/dell2.jpeg","./assets/dell3.jpg"], "captions":["Yours is here","Easy as dell","Uniquely you"],

我有一个集合品牌,我必须替换路径./assets/to D:/data/db/images,我在多个文档中多次出现过这种情况。如何使用查询来实现这一点

每份文件的样本

{"name":"Dell","images":["./assets/dell1.jpg","./assets/dell2.jpeg","./assets/dell3.jpg"],
             "captions":["Yours is here","Easy as dell","Uniquely you"],
             "logo":"./assets/dell4.png",
             "details":{"headOffice":"Bangalore","address":"No.12/1, Divyashree Green, Koramangala Inner Ring Rd, Domlur, Bengaluru - 560071",
             "phoneNumber":"(080) 28077000  ","website":"www.dell.com"}
             }

您可以使用聚合框架的运算符将聚合的输出重定向到特定集合。如果指定相同的集合名称,则它将替换现有集合

要覆盖现有字段,可以使用运算符。然后,您只需使用删除
/assets/
的长度,并使用将其与新前缀连接起来

在MongoDB 3.2中,可以运行以下脚本:

db.Brands.find().forEach(function(doc){
    doc.images = doc.images.map(function(image){ return image.replace("./assets/","D:/data/db/images/") })
    db.Brands.save(doc);    
})

我相信这不是一种优雅的方式,但对于小系列,我们通常称之为mongodump、sed和mongorestore。非常简单,但非常系统管理,如:-)请解释您所说的内容使用
mongodumb
将您的收藏转储为文本文件(在任何其他步骤之前保留一份副本),然后使用
sed
进行文本替换,并使用
mongorestore
将修改后的文档重新注入数据库。如果您不在Linux上,您可以忘记该解决方案。如果您的收藏包含超过10000个条目,您最好也忘记它。对不起,我没有在您的路径中看到
D://
。您使用的是windows,我的解决方案没有帮助。很遗憾,我使用的是MongoDB 3.2,是否有其他解决方法?是否可以附加任何输出?请检查集合名称。我使用dummy
col
只是为了在我的机器上进行测试,在我的回答中改为Brands。在执行之前,我改变了这一点,它不起作用。也许你可以用你的帖子中的文档创建一个新的集合,运行这个脚本并检查它是否起作用(我就是这么做的),然后尝试将该数据模型与你的数据模型进行比较
db.Brands.find().forEach(function(doc){
    doc.images = doc.images.map(function(image){ return image.replace("./assets/","D:/data/db/images/") })
    db.Brands.save(doc);    
})