import cloud from '@lafjs/cloud';
import { MongoClient } from 'mongodb';
// 设置MongoDB连接字符串,包含数据库用户名和密码(如果有的话)
const dbUrl = 'mongodb://laf:laf@xxx.com:27017/laf';
export default async function migrateUsers() {
const db0 = await connectDatabase();
// 远程数据集合
const remoteCollection = await db0.collection('trades');
// 获取远程集合的总记录数
const total = await remoteCollection.countDocuments(); // Use countDocuments() instead of count()
console.log(total);
// 每次迁移的记录数
const batchSize = 1000;
// 计算需要迁移的批次数
const batchCount = Math.ceil(total / batchSize);
for (let i = 0; i < batchCount; i++) {
// 获取当前批次的数据
const users = await remoteCollection.find().skip(i * batchSize).limit(batchSize).toArray();
// console.log(users)
// 批量插入到本地集合中
await insertBatchToLocalCollection(users.map(item => {
return {
"address": item.address,
"cost": item.cost,
"amount": item.amount
}
}));
}
console.log('迁移完成')
}
// 定义全局的MongoClient实例
let client = null;
// 连接数据库的函数
async function connectDatabase() {
try {
// 连接MongoDB数据库
client = await MongoClient.connect(dbUrl, {
useUnifiedTopology: true, // 使用新的拓扑引擎
});
console.log('成功连接到MongoDB数据库!');
// 返回数据库实例,可以在其他模块中使用它
return client.db();
} catch (err) {
console.error('连接数据库时出错:', err);
throw err;
}
}
// 批量插入到本地集合的函数
async function insertBatchToLocalCollection(users) {
if (users.length === 0) {
return; // If no data, don't insert
}
const db = cloud.database();
// 迁移到laf目标集合
await db.collection('trades').add(users, { multi: true })
}