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. git存储用户名与密码

    git config credential.helper store git config --global credential.helper cache ... which tells git t ...

  2. Java在Service层异常封装

    dao层不需要抛出异常,应该在service层抛出异常,可以是自定义的异常,也可以包装异常,然后在controller中定义exception handler统一处理或者单独处理. 参考: https ...

  3. android ndk-build 编译静态库libxx.a 以及Android studio openssl 静态库配置(cmake)

    android ndk-build 编译静态库libxx.a 需求场景: 目前有安卓编码好的现在的openssl的两个.a,我们需要调用openssl的函数,并把功能再封装成.a; 这样使用时,在an ...

  4. Ubuntu16.04下安装搭配Python3.6相关配置软件方法

    1 安装Python3.6.4 此处推荐直接安装Anaconda3,来实现Python3.6.4的环境配置. Anaconda3下载链接:https://www.anaconda.com/downlo ...

  5. 每天一个linux命令(3):ls命令

    1.命令简介 ls(list 列出目录内容)命令用来列出显示指定目录里的文件及文件夹清单,缺省下ls用来打印出当前目录的清单.通过ls 命令不仅可以查看linux文件夹包含的文件,而且可以查看文件权限 ...

  6. sublime text 3-right click context menu

    dd a system wide windows explorer button " Edit with Sublime" similar to how Notepad++ doe ...

  7. aaronyang的百度地图API之LBS云与.NET开发 Javascript API 2.0【把数据存到LBS云2/2】

    中国的IT 需要无私分享和贡献的人,一起努力 本篇博客来自地址:http://www.cnblogs.com/AaronYang/p/3672898.html,请支持原创,未经允许不许转载 1.新建一 ...

  8. [ci]jenkins构建容器项目java-helloworld-非docker plugin模式

    栗子思路说明: 不使用任何docker plugin 使用jenkins server本地(含mvn环境)构建,无jenkins slave jenkins server本地构建的war包,推送dep ...

  9. JAVA和JAVAC 命令行

    转自:http://www.blogjava.net/pdw2009/archive/2008/06/12/207413.html?opt=admin javac和java命令行中的-classpat ...

  10. 基于Openresty+的WEB安全防护系统架构--转

    随着时间的推移,我们在实践中也不断的演进我们的服务部署方案,希望WEB防护,不只是单独的云WAF来保护服务,而有其它的相关服务,对WAF进行增强加固的合理配合.我们使用Openresty+系统构建了W ...