我需要把原来的 MongoDB 数据完整拷贝到新服务器上,查了一下实现方式蛮多的,但我觉得都不如写个 node 脚本来实现自由方便,这个方式也应该没有跨版本不兼容的坑,至少我从3.4升级到4.2是没问题的 脚本依赖 mongodb, 需确保 node.js 版本支持直接运行 async + await mongodb-copy.js
const {MongoClient} = require('mongodb');
// 源库地址
const baseUrl = 'mongodb://asseek:123456@xxx.xxx.xxx.xxx:27017/i_mall?authSource=admin';
//目标库地址 我这是开启了security视自己情况改
const targetUrl = 'mongodb://asseek:123456@127.0.0.1:27017/i_mall?authSource=admin';
// 要复制的库名
const dbName = 'i_mall';
// 要复制的表名 为空复制所有表
const collections = [];
// 要排除的表名
const excludeCollections = [];
// 拷贝前是否先删除目标库数据 如果确保不会出现主键重复可关闭
const dropTarget = true;
//数据分片大小 避免表太大占爆内存
const sharding = 10000;
(async () => {
console.time('mongodb-copy');
let collectionLength = 0, insertLength = 0, dropLength = 0;
try {
const baseClient = await MongoClient.connect(baseUrl, {useUnifiedTopology: true});
const baseDb = await baseClient.db(dbName);
const targetClient = await MongoClient.connect(targetUrl, {useUnifiedTopology: true});
const targetDb = await targetClient.db(dbName);
try {
const baseCollections = await baseDb.collections();
for (const baseCollection of baseCollections) {
const name = baseCollection.collectionName;
if (collections.length && !collections.includes(name)) continue;
if (excludeCollections.includes(name)) continue;
const targetCollection = targetDb.collection(name);
let count = await baseCollection.find().count();
let drop = 0, insert = 0, _id = '';
if (dropTarget) {
const {result: {n}} = await targetCollection.deleteMany();
dropLength += n;
drop = n;
}
while (count > 0) {
const search = _id ? {_id: {$gt: _id}} : {};
const baseResults = await baseCollection.find(search).limit(sharding).toArray();
if (baseResults.length) {
const {result: {n}} = await targetCollection.insertMany(baseResults);
insertLength += n;
insert += n;
_id = baseResults[baseResults.length - 1]._id;
}
count -= sharding;
}
collectionLength += 1;
console.log(`[${name}] [删除${drop}] [插入${insert}]`);
}
baseClient.close();
targetClient.close();
} catch (e) {
console.error('出错了', e);
baseClient.close();
targetClient.close();
}
} catch (e) {
console.error('连接问题', e);
}
console.log(`mongodb-copy: [复制集合${collectionLength}个] [删除${dropLength}] [插入${insertLength}]`);
console.timeEnd('mongodb-copy');
})();
直接控制台执行文件
node mongodb-copy.js
拖远程库瓶颈基本都在数据传输上,200万条数据的库全部复制过来花了26分钟
测试了一下本地拷贝个200万数据的库1分39秒
原文:https://segmentfault.com/a/1190000021160811
MongoDB 3.0之后,explain的返回与使用方法与之前版本有了不少变化,介于3.0之后的优秀特色,本文仅针对MongoDB 3.0+的explain进行讨论。现版本explain有三种模式,分别如下:queryPlanner、executionStats、allPlansExecution
Redis、MongoDB及Memcached的基本概念、特点、应用场景、Redis是一个key-value存储系统(布式内缓存,高性能的key-value数据库);MongoDB是一个介于关系数据库和非关系数据库之间的产品;Memcached是一个高性能的分布式内存对象缓存系统
本教程介绍mongodb中添加用户的一些操作,mongodb中的用户是什么?在mongodb中通过用户来管理每个数据库的权限,想要控制数据库的使用权,就需要添加用户,给指定的用户分配权限,让特定用户来做特定的操作。
在做自己的一个小项目时,新学习了mongodb非关系型数据库,使用了mongoose封装好的查询方法,包括数据库分页用到的limit和skip方法,这里记录下。
插入数据例:向默认的test数据库的wj表中插入数据;查询数据查询test数据库的wj表中name值不为测试的数据;更新数据;
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!