MongoDB中数据的替换方法实现类Replace()函数功能详解

近日接到一个开发需求,因业务调整,需要DBA协助,将MongoDB数据库中某集合的进行替换。例如我们需要将集合A中B字段中,有关《美好》的字符替换为 《非常美好》。个人感觉这个需求如果是在SQL Server 或MySQL 数据库上处理是小菜一碟,如果是针对MongoDB数据,可能要费神了。

1.常见关系数据数据库中的替换函数

在SQL Server数据库中,我们用Replace函数来实现字符的替换。

语法

REPLACE ( ''string_replace1'' , ''string_replace2'' , ''string_replace3'' )

参数

''string_replace1''

待搜索的字符串表达式。string_replace1 可以是字符数据或二进制数据。

''string_replace2''

待查找的字符串表达式。string_replace2 可以是字符数据或二进制数据。

''string_replace3''

替换用的字符串表达式。string_replace3 可以是字符数据或二进制数据。

 例如将 字符串 SQL Server 数据库 中的  SQL Server 替换为 MongoDB。

实现语句如下:

在MySQL数据库中语法类似。

2.在MongoDB中实现替换方法

很可惜,到目前为止还没有找到类似SQL Server的替换函数,那么我们怎么去实现文档中的数据替换呢?特别是集合中的文档数量比较大时。

假设现在有用户信息文档,如下。注意其中有联系地址。

{
  "_id" : ObjectId("5c77e5f85f53771b74bc87e0"),
  "username" : "hanmeimei",
  "email" : "123456@126.com",
  "tel" : 7891233,
  "addresses" : {
    "provice" : "山东省",
    "city" : "菏泽市鄄城县曹集镇",
    "stree" : "武状元街道28号"
  }
},
/* 2 createdAt:2019/2/28 下午9:45:28*/
{
  "_id" : ObjectId("5c77e5f85f53771b74bc87df"),
  "username" : "Lily",
  "email" : "123456@126.com",
  "tel" : 123455,
  "addresses" : [
    {
      "provice" : "河南省",
      "city" : "郑州市登封县李集镇",
      "stree" : "少林街道28号"
    }
  ]
},
/* 3 createdAt:2019/2/28 下午9:45:28*/
{
  "_id" : ObjectId("5c77e5f85f53771b74bc87de"),
  "username" : "Lily",
  "email" : "123456@126.com",
  "tel" : 123455,
  "addresses" : {
    "provice" : "山东省",
    "city" : "菏泽市定陶县曹集镇",
    "stree" : "武状元街道28号"
  }
},
/* 4 createdAt:2019/2/28 下午9:45:28*/
{
  "_id" : ObjectId("5c77e5f85f53771b74bc87dd"),
  "username" : "jack",
  "email" : "123456@126.com",
  "tel" : 123455,
  "addresses" : {
    "provice" : "山东省",
    "city" : "菏泽市定陶县",
    "stree" : "武状元街道28号"
  }
}

现在因为行政区域划分,将 菏泽市定陶县划为定陶县区。那么怎么进行批量修改呢? MongoDB中没有Replace。

Update,也不好写代码。

最终.......我们还是找到了一个方法。

大家是先看看执行的代码及实现的结果。

 db.user.find({'addresses.city':{'$regex': /菏泽市定陶县/ }}).forEach(
  function(item) {
    var tmp = String(item.addresses.city)
    tmp = tmp.replace('菏泽市定陶县','菏泽市定陶县区')
    if (tmp == null){
      print(item.addresses.city)
    }

    item.addresses.city = tmp ;

     db.user.save(item);
  }
 );

  

 

执行后,再次查看数据,结果如下:

/* 1 createdAt:2019/2/28 下午9:45:28*/
{
  "_id" : ObjectId("5c77e5f85f53771b74bc87e0"),
  "username" : "hanmeimei",
  "email" : "123456@126.com",
  "tel" : 7891233,
  "addresses" : {
    "provice" : "山东省",
    "city" : "菏泽市鄄城县曹集镇",
    "stree" : "武状元街道28号"
  }
},
/* 2 createdAt:2019/2/28 下午9:45:28*/
{
  "_id" : ObjectId("5c77e5f85f53771b74bc87df"),
  "username" : "Lily",
  "email" : "123456@126.com",
  "tel" : 123455,
  "addresses" : [
    {
      "provice" : "河南省",
      "city" : "郑州市登封县李集镇",
      "stree" : "少林街道28号"
    }
  ]
},
/* 3 createdAt:2019/2/28 下午9:45:28*/
{
  "_id" : ObjectId("5c77e5f85f53771b74bc87de"),
  "username" : "Lily",
  "email" : "123456@126.com",
  "tel" : 123455,
  "addresses" : {
    "provice" : "山东省",
    "city" : "菏泽市定陶县区曹集镇",
    "stree" : "武状元街道28号"
  }
},
/* 4 createdAt:2019/2/28 下午9:45:28*/
{
  "_id" : ObjectId("5c77e5f85f53771b74bc87dd"),
  "username" : "jack",
  "email" : "123456@126.com",
  "tel" : 123455,
  "addresses" : {
    "provice" : "山东省",
    "city" : "菏泽市定陶县区",
    "stree" : "武状元街道28号"
  }
}

集合文档中addresses.city中的'菏泽市定陶县' 全部被 '菏泽市定陶县区' 替换,符合设计要求。

3.知识补充与回顾

(1)作为一个数据库,MongoDB有一个很大的优势—它使用js管理数据库,所以也能够使用js脚本进行复杂的管理。MongoDB自带JavaScript shell,可在shell中使用命令行与MongoDB进行交互。shell是一个功能完备的JavaScript解释器,可运行任意JavaScript程序。

mongodb 的shell是javascript实现的,如果直接使用js实现相应的功能则显得很直观和简便。比如我们对一些数据进行 统计计算,除了使用mapreduce和aggreate框架之外,直接使用js也是很好的选择。还有一些批处理,数据同步都可以使用js

例如将集合中所有的文档,打印出来--  db.collectionname.find().forEach(printjson)。

注意:在上面演示的MongoDB替换字符的脚本,都在mongodb shell 和 nosqlbooster 工具里面验证过,没有问题。但是相同的代码在mongodb shell中要注意格式要求,最好要符合Javascript 格式要求,否则,可能报错,如:E QUERY    [thread1] SyntaxError: missing ; before statement @(shell):1:138

(2)forEach:MongoDB数据库使用游标返回find的执行结果。客户端对游标的实现通常能够对最终结果进行有效的控制。可以限制结果的数量,略过部分结果,根据任意键按任意顺序的组合对结果进行各种排序,或者是执行其他一些强大的操作。游标有一个重要的迭代函数---cursor.forEach(回调函数),允许我们自定义回调函数来逐个处理每个单元.

(3)$regex :正则表达式是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。MongoDB 使用 $regex 操作符来设置匹配字符串的正则表达式。

更多关于MongoDB中数据的替换方法实现的方法请查看下面的相关链接

(0)

相关推荐

  • MongoDB数据库安装配置、基本操作实例详解

    本文实例讲述了MongoDB数据库安装配置.基本操作.分享给大家供大家参考,具体如下: 1.简介 NO SQL:NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL",是对不同于传统的关系数据库管理系统(RDBMS)的统称.NoSQL用于超大规模数据的存储,这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展. RDBMS NOSQL - 高度组织化结构化数据 - 结构化查询语言(SQL) - 数据和关系都存储在单独的表中. - 数据操纵语言,数据定

  • Windows安装压缩版MongoDB的教程

    MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 下载安装包 官网:mongodb-win32-x86_64-2012plus-4.2.1.zip 安装 解压安装包到任意目录,在解压根目录中创建配置文件mongo.conf,内容如下: #数据库路径 dbpath=D:/tools/mongodb-4.0.1

  • 修复 Mac brew 安装 mongodb 报 Error: No available formula with the name ‘mongodb’ 问题详解

    根据 homebrew-brew 官方的解释得知,MongoDB 不再是开源的了,并且已经从 Homebrew中移除 #43770 正是由于 MongoDB 的商业化不太理想,所以它选择了闭源.所以,在它闭源之前的那些 brew 安装方法都会报错了.网上很多的文章都是基于以前古老的安装方式,这种方式导致 brew 无法安装,报错. Error: No available formula with the name 'mongodb' 新的安装方式可以参考 github 主页,https://gi

  • Win10 64位安装MongoDB数据库的详细教程

    选择对应的系统并下载MongoDB https://www.mongodb.com/download-center/community 选择操作系统对应的版本 我是win10 64位,所以选择如下版本: 下载完的安装包: 双击安装时,选择自定义,可以修改安装目录: 我修改目录如下: D:\Program Files\MongoDB\Server\4.2\ 安装过程中的配置选择 服务配置说明 Run Service as Network Service user 以网络服务用户身份运行服务(默认)

  • dotnet core链接mongodb代码实例

    这篇文章主要介绍了dotnet core链接mongodb代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 导入命名空间 using MongoDB.Bson; using MongoDB.Driver; 测试示例: var client = new MongoClient("mongodb://127.0.0.1:27017"); var database = client.GetDatabase("foo"

  • MongoDB常用数据库命令大全

    一.MongoDB 数据库常用操作命令 1.Help查看命令提示 help db.help(); db.yourColl.help(); 2.切换/创建数据库 use raykaeso; 当创建一个集合(table)的时候会自动创建当前数据库 3.查询所有数据库 show dbs; 4.删除当前使用数据库 db.dropDatabase(); 5.从指定主机上克隆数据库 db.cloneDatabase("127.0.0.1"); 将指定机器上的数据库的数据克隆到当前数据库 6.从指定

  • MongoDB 数据库的命名、设计规范详解

    MongoDB 数据库的命名和设计也有一套规范.只不过,由于用的人不多,目前在业界还没有形成权威的共识,今天根据我个人平时的一些经验,总结了一些规范 第一部分,我们先说命名规范. 文档 设计约束 UTF-8 字符 不能包含 \0 字符(空字符),这个字符标识建的结尾 . 和 $ 有特殊含义,需要避免 区分大小写 键不能重复 键/值对有序 实践约束 [强制]文档中的key禁止使用_以外的特殊字符 [强制]key全部小写,多个单词可以下划线分割 [强制]禁止使用数字打头的key [强制]禁止自定义_

  • mongodb基本命令实例小结

    本文实例讲述了mongodb基本命令.分享给大家供大家参考,具体如下: 1 切换数据库 use admin; 2 查看当前数据库 db; 2.1 查看所有数据库 show dbs; 3 查看当前数据库下面的表 show collections; 4 删除数据库 use test; db.dropDatabase(); #删除当前数据库 show dbs; #验证删除结果 5 删除集合或者表 db.table_name.drop(); #删除表 table_name 6 查看账号信息 mongo

  • 关于MongoDB谨防索引seek的效率问题详析

    背景 最近线上的一个工单分析服务一直不大稳定,监控平台时不时发出数据库操作超时的告警. 运维兄弟沟通后,发现在每天凌晨1点都会出现若干次的业务操作失败,而数据库监控上并没有发现明显的异常. 在该分析服务的日志中发现了某个数据库操作产生了 SocketTimeoutException. 开发同学一开始希望通过调整 MongoDB Java Driver 的超时参数来规避这个问题. 但经过详细分析之后,这样是无法根治问题的,而且超时配置应该如何调整也难以评估. 下面是关于对这个问题的分析.调优的过程

  • Zabbix3.4监控mongodb数据库状态的方法

    mongodb有db.serverStatus()命令,可以查看mongodb的运行状态,那么zabbix就可以调用这个命令实现mongodb的监控. 一.db.serverStatus()命令的使用 注:只有超级管理员账号才有权限使用此命令 1.查看mongodb服务状态 echo "db.serverStatus()" | mongo --port 37485 -u username -p 'password' --authenticationDatabase 'admin' 2.

  • nodejs对mongodb数据库的增加修删该查实例代码

    以下是实例代码: /** 1.npm install mongodb --save-dev / cnpm install mongodb --save-dev 2.var MongoClient = require('mongodb').MongoClient; var url = 'mongodb://localhost:27017/test'; 连接数据库的地址 3.连接数据库 MongoClient.connect(url, function(err, db) { }); 4.实现增加修改

  • Node.js操作MongoDB数据库实例分析

    本文实例讲述了Node.js操作MongoDB数据库.分享给大家供大家参考,具体如下: Node.js操作MongoDB npm init npm i mongodb --save { "name": "test", "version": "1.0.0", "description": "", "main": "app.js", "scr

  • Windows10安装MongoDB4.0详细步骤及启动配置教程

    redis 官方没有 Windows 版的,微软维护的已经好久没更新了,所以就在想着换成 MongoDB. 一.安装 首先去官网下载Mongodb安装包,网址https://www.mongodb.com/download-center/community,下载完成后双击安装就行 安装步骤: 1.点击next 2.勾选左下角,点击next 3.选择默认安装路径,点击completem:自己定义安装路径,点击custom,点击browse选择路径,点击next 4.直接点击next 5.取消左下角

  • Python操作redis和mongoDB的方法

    一.操作redis redis是一个key-value存储系统,value的类型包括string(字符串),list(链表),set(集合),zset(有序集合),hash(哈希类型).为了保证效率,数据都是缓冲在内存中,在处理大规模数据读写的场景下运用比较多. 备注:默认redis有16个数据库,即db0~db15, 一般存取数据如果不指定库的话,默认都是存在db0中. resid提供2种连接方式:直接连接.连接池连接 1.直接连接示例: import redis # pip3 install

  • linux下安装mongodb教程

    MongoDB是跨平台的,既可以在windows上安装,也可以在linux下安装,这里我们着重介绍Linux下的MongoDB安装. ** 1.MongoDB 提供了 linux 各发行版本 64 位的安装包,你可以在官网下载安装包. curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.2.12.tgz 我竟然下载了27分钟.... 2.默认下载路径是到用户目录下的Downloads目录,将其解压 tar -zxvf m

  • 在Laravel中使用MongoDB的方法示例

    MongoDB实用场景 产品用户访问日志,点击埋点统计信息 业务系统环境参数配置信息 业务系统运行时日志,如laravel.log,nginx.log 使用Homebrew在macoOS安装MongoDB PHP Driver 在macOS中,MongoDB 扩展已经从Homebrew仓库中移除,需要通过pecl安装此扩展. $ sudo pecl install mongodb -v ... Build process completed successfully Installing '/u

  • 28个MongoDB经典面试题详解

    MongoDB是目前最好的面向文档的免费开源NoSQL数据库. 如果你正准备参加MongoDB NoSQL数据库的技术面试,你最好看看下面的MongoDB NoSQL面试问答. 这些MongoDB NoSQL面试问答涵盖了NoSQL数据库基本的概念,复制(Replication),分片(Sharding),事务和锁,跟踪分析工具(Profiler),Nuances和日志等特性. 让我们看看下面的这些MongoDB NoSQL数据库的面试问答吧: 1. 你说的NoSQL数据库是什么意思?NoSQL

  • MongoDB启动报错 28663 Cannot start server

    今天学习mongoDB的时候,启动总是失败,搜了好久找到这个文档解决了问题,是引擎的问题,具体如下: 启动MongoDB服务 进入安装目录的bin目录 在CMD中执行: mongod --dbpath=数据存放目录这里可以在任何位置建立一个文件夹 有可能在安装过程中出现问题,比如提示 28663错误,则是引擎不适合MONGODB 需要在启动的时加上 -storageEngine=mmapv1 MongoDB学习笔记:28663 Cannot start server. The default s

随机推荐