-
Notifications
You must be signed in to change notification settings - Fork 5
/
mirrorUtil.js
95 lines (86 loc) · 3.25 KB
/
mirrorUtil.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
// @ts-check
const MongoClient = require('mongodb').MongoClient;
class MongoDbClientWrapper {
constructor (url) {
this.url = url;
this.client = null;
}
async connect () {
this.client = await MongoClient.connect(this.url, { useNewUrlParser: true, useUnifiedTopology: true })
.catch(err => { console.log(err); this.client = null; });
}
async deleteDb (dbName) {
if (! this.client ) await this.connect();
let db = this.client.db(dbName);
return await db.dropDatabase();
}
async listDatabases () {
if (! this.client ) await this.connect();
let dbs = await this.client.db().admin().listDatabases();
return dbs.databases;
}
async getClient() {
if (! this.client ) await this.connect();
return this.client
}
}
async function deleteAll(url) {
let dgVd = new MongoDbClientWrapper(url);
let dgVdClient = await dgVd.getClient();
let dbList = await dgVd.listDatabases();
let sysDbs = ['admin', 'config', 'local'];
for (let i = 0; i < dbList.length; i++) {
let j = sysDbs.indexOf(dbList[i].name);
if (j > -1)
continue;
await dgVd.deleteDb(dbList[i].name);
}
console.log(`Done delete all`);
}
async function doIt(fromUrl, toUrl) {
let from = new MongoDbClientWrapper(fromUrl);
let fromClient = await from.getClient();
let to = new MongoDbClientWrapper(toUrl);
let toClient = await to.getClient();
let dbList = await from.listDatabases();
//console.log("List: ", dbList);
let sysDbs = ['admin', 'config', 'local'];
let collections = ['data', 'metaData', 'editlog', 'attachments'];
for (let i = 0; i < dbList.length; i++) {
let j = sysDbs.indexOf(dbList[i].name);
if (j > -1)
continue;
for (let j = 0; j < collections.length; j++) {
let fromCol = fromClient.db(dbList[i].name).collection(collections[j]);
let toCol = toClient.db(dbList[i].name).collection(collections[j]);
let fn = null;
const cursor = fromCol.find();
for await (let doc of cursor) {
//console.log(`Found record: ${JSON.stringify(doc, null, 4)}`);
if (fn) {
// @ts-ignore
doc = fn(doc);
}
let ret = await toCol.insertOne(doc);
if (ret.result.ok !== 1) {
console.log(`InsertOne failed: ${ret.result}`);
}
}
}
console.log(`Done copying: ${dbList[i].name}`);
}
dbList = await to.listDatabases();
console.log("Done copy. Database List on destination: ", dbList);
}
// First, make sure no dbs are there in the destination. Use the below
// if needed. Run this from datagroom:~/datagroom-gateway
// ~/nodejs/node-v14.17.3-linux-x64/bin/node mirrorUtil.js
(async () => {
await deleteAll('mongodb://in-debbld-33:27017');
// Now copy everything.
doIt('mongodb://datagroom:27017', 'mongodb://in-debbld-33:27017');
})()
// scp -r attachments swuser@in-debbld-33:~/datagroom-gateway/
// After this, do an 'scp' to copy all attachments. Do this as 'root' from
// in-mvlb52
// scp -r attachments swuser@in-datagroom-vd:~/datagroom-gateway/