tw项目中用的是mongo数据库,数据的迁移也是需求的一部分。这时我们可以使用migrate-mongo在nodejs中方便的进行数据的迁移,以下记录一下使用的过程。

一、migrate-mongo的使用

全局安装:npm install -g migrate-mongo,在项目中也可以局部安装:npm install migrate-mongo。

运行migrate-mongo,可以看到migrate-mongo支持以下的命令:

  • init                                      initialize a new migration project
  • create [options] [description]      create a new database migration with the provided description
  • up [options]                              run all unapplied database migrations
  • down [options]                          undo the last applied database migration
  • status [options]                         print the changelog of the database

现在我们就来实践一下,来体验migrate-mongo的使用。首先我们创建一个目录,存放migration的脚本。

~/Program/javascript/node/--/learn-node/node1> mkdir migrations
~/Program/javascript/node/--/learn-node/node1> cd migration

我们的mongodb里面customer表的数据如下:

/* 1 */
{
"_id" : ObjectId("5b6d4ea91eb211b1c51600f8"),
"firstName" : "Alice",
"lastName" : "Smith",
"_class" : "com.thoughtworks.springcloud.entity.Customer"
} /* 2 */
{
"_id" : ObjectId("5b6d4ea91eb211b1c51600f9"),
"firstName" : "Bob",
"lastName" : "Smith",
"_class" : "com.thoughtworks.springcloud.entity.Customer"
}

创建migration的配置文件:migrate-mongo init,生成的config.js内容配置,其中mogodb的地址是本地,数据库名为huhx。

'use strict';
module.exports = { mongodb: {
url: 'mongodb://localhost:27017',
databaseName: "huhx", options: {
useNewUrlParser: true, // removes a deprecation warning when connecting
// connectTimeoutMS: 3600000, // increase connection timeout to 1 hour
// socketTimeoutMS: 3600000, // increase socket timeout to 1 hour
}
}, // The migrations dir, can be an relative or absolute path. Only edit this when really necessary.
migrationsDir: 'migrations', // The mongodb collection where the applied changes are stored. Only edit this when really necessary.
changelogCollectionName: 'changelog',
};

然后我们创建我们的迁移脚本,在表里面加上一个更新lastname=Smith的值为hu。

~/Program/javascript/node/--/learn-node/node1/migrations> migrate-mongo create addfullnamefield
Created: migrations/-addfullnamefield.js

我们编写20180915084157-addfullnamefield.js的内容如下:

'use strict';
module.exports = {
up(db) {
// TODO write your migration here
const customerList = db.collection('customer').find({firstName: 'Alice'});
return customerList.forEach(item => {
const fullName = `${item.firstName} ${item.lastName}`;
db.collection('customer').updateOne({_id: item._id}, {$set: {fullName: fullName}}, {multi: });
});
}, down(db) {
// TODO write the statements to rollback your migration (if possible)
return db.collection('customer').updateMany({firstName: 'Alice'}, {$unset: {fullName: ''}});
}
};

此时我们可以使用migrate-mongo status命令来查看migrate的状态:

运行migrate-mongo up正式执行migration。如下所示

~/Program/javascript/node/--/learn-node/node1/migrations> migrate-mongo up
MIGRATED UP: -addfullnamefield.js

此时我们可以看到在huhx的数据库,可以看到changelog的collection。里面的内容如下:

{
"_id" : ObjectId("5b9ccd21adbd49b60990f0b8"),
"fileName" : "20180915084157-addfullnamefield.js",
"appliedAt" : ISODate("2018-09-15T09:13:05.272Z")
}

而且我们的customer中的数据,也相应的得到了迁移处理。

/* 1 */
{
"_id" : ObjectId("5b6d4ea91eb211b1c51600f8"),
"firstName" : "Alice",
"lastName" : "Smith",
"_class" : "com.thoughtworks.springcloud.entity.Customer",
"fullName" : "Alice Smith"
} /* 2 */
{
"_id" : ObjectId("5b6d4ea91eb211b1c51600f9"),
"firstName" : "Bob",
"lastName" : "Smith",
"_class" : "com.thoughtworks.springcloud.entity.Customer"
}

需要注意的是关于up的函数:

  • function up(db) { /* */ } should return Promise
  • function up(db, next) { /* */ } should callback next

如果我们要撤销修改,我们可以执行migrate-mongo downw命令,也就是执行我们定义的down()函数的内容,产生的效果是customer表中fullName字段删除了,而且查看changelog数据也是为空。再次运行migrate-mongo status查看状态:

最后我们也可以指定其它的配置文件,使用-f 参数。

如果我们的addfullnamefield.js文件改变了,想要重新migrate up(已经up过了)。做法是在数据库changelog中删除记录或者是重新写一个脚本,再跑一次migrate-mongo up命令。

友情链接

fs项目---->migrate-mongo的使用(一)的更多相关文章

  1. fs项目---->async/await的学习(一)

    2018-07-11号,我来到了fs项目组担任后端开发的角色.这是我来thoughtworks以来首个的正式项目,不管是在技术还是在敏捷的实践中都是受益匪浅.来感受tw特殊的文化的同时,我希望自己能够 ...

  2. fs项目---->cron框架的学习(一)

    Cron是一种允许您按计划执行某些内容的工具.这通常使用cron语法来完成.我们允许您在计划作业触发时执行函数.我们还允许您使用子进程执行javascript进程外部的作业.此外,这个库超出了基本的c ...

  3. mongo语句优化分析

    参考原文:http://www.mongoing.com/eshu_explain3 理想的查询状态由以下两种 普通查询: nReturned=totalKeysExamined & tota ...

  4. 【MongoDB】MongoDB与项目搭配启动进程

    项目启动/数据连接命令  (20180701成功且不用再找正确关闭mongoDB的方式) 如上图在mongoDB的bin目录的同级新建mongo.config.mongostart.bat.mongo ...

  5. Mongo学习记录

    引子 最近做项目利用mongo记录的日志做数据统计.着了非关系型数据库的迷,于是乎买了本<MongoDB实战>学习了一番.记录一下学习笔记,共享之. 准备 我在自己的Linux服务器上装了 ...

  6. Ubuntu14.04下Mongodb(离线安装方式|非apt-get)安装部署步骤(图文详解)(博主推荐)

    不多说,直接上干货! 说在前面的话  首先,查看下你的操作系统的版本. root@zhouls-virtual-machine:~# cat /etc/issue Ubuntu LTS \n \l r ...

  7. Ubuntu16.04下Mongodb(离线安装方式|非apt-get)安装部署步骤(图文详解)(博主推荐)

    不多说,直接上干货! 说在前面的话  首先,查看下你的操作系统的版本. root@zhouls-virtual-machine:~# cat /etc/issue Ubuntu LTS \n \l r ...

  8. rails命令行命令

    x.指定端口启动rails项目 ruby script/server webrick -p 3000 ------------------------------------------------- ...

  9. HEXO与Github.io搭建个人博客

    HEXO与Github.io搭建个人博客 HEXO搭建    HEXO是基于Node.JS的一款简单快速的博客框架,能够支持多线程,支持markdown,可以将生成的静态网页发布到github.io以 ...

随机推荐

  1. Java断言绝对不是鸡肋

    在防御式编程中经常会用断言(Assertion)对参数和环境做出判断,避免程序因不当的输入或错误的环境而产生逻辑异常,断言在很多语言中都存在,C.C++.Python 都有不同的断言表示形式.在Jav ...

  2. [Functional Programming] From simple implementation to Currying to Partial Application

    Let's say we want to write a most simple implementation 'avg' function: const avg = list => { let ...

  3. JavaScript比较两个对象的值是否相等

    JavaScript比较两个对象的值是否相等 function isObjectValueEqual(a, b) { var aProps = Object.getOwnPropertyNames(a ...

  4. windows多线程同步--信号量

    推荐参考博客:秒杀多线程第八篇 经典线程同步 信号量Semaphore   首先先介绍和windows信号量有关的两个API:创建信号量.释放信号量   HANDLE WINAPI CreateSem ...

  5. Windows 下使用 MinGW 和 CMake 进行开发

    CMake 是个非常棒的项目管理工具,这已经是毋庸置疑的. 一些小工具需要在 win 下开发,所以今天探索使用 MinGW 和 CMake 在 win 下的搭配使用.简单做记录. MinGW 使用 Q ...

  6. MySql之游标的使用

    一:游标的使用场合 游标只能用于存储过程和函数中. 游标存储了检索语句的结果集,然后在存储过程和函数中可以通过游标来迭代访问结果集中的记录. 二:创建游标 CREATE PROCEDURE 存储过程名 ...

  7. virtualbox centos安装增强工具和Centos与VirtualBox共享文件夹设置

    VirtualBox 大家都习惯性把它简称为 Vbox ,比 VM 的体积小.开源.速 度快.不过在使用 VirtualBox  在虚拟机中安装 CentOS 之后,不能直接运行安装好 Virtual ...

  8. ROS中测试机器人里程计信息

    在移动机器人建图和导航过程中,提供相对准确的里程计信息非常关键,是后续很多工作的基础,因此需要对其进行测试保证没有严重的错误或偏差.实际中最可能发生错误的地方在于机器人运动学公式有误,或者正负号不对, ...

  9. mysql和redis的区别

    一..redis和mysql的区别总结 (1)类型上         从类型上来说,mysql是关系型数据库,redis是缓存数据库 (2)作用上        mysql用于持久化的存储数据到硬盘, ...

  10. KeyTool 和 OpenSSL 相互转换 [转]

    REM 生成自签名 CA 证书 REM Win32 OpenSSL REM http://slproweb.com/products/Win32OpenSSL.html REM How to crea ...