golang / python 複製mongodb

我有一個項目,是將從各個微服務聚合來的swagger 接口文檔保存至mongodb ,聚合用的是 mongodb-reactive-data (spring data),在遷移的時候,發現服務器未安裝mongodump ,打算用python 逐條複製過去 自庫 iiapp 複製到 iiapp_test

#!/usr/bin/python3
import pymongo
import urllib.parse

# 密碼包含特殊字符,需進行URL編碼
uri = "mongodb://admin:"+ urllib.parse.quote("admin@pwd")+"@127.0.0.1:27017/"
print(uri)
myclient = pymongo.MongoClient(uri)
 
dblist = myclient.list_database_names()
print("mongodb 表:")
print(dblist)

db1 = myclient["iiapp"]
db2 = myclient["iiapp_test"]

for x in db1["com_api"].find():
    db2["com_api"].insert_one(x)


myclient.close()

複製過去後,發現java代碼 mongoTemplate.findById(comId, Document.class, "com_api"); 查找Document的時候報錯 仔細比較原始數據和複製後的數據發現,python在保存mongodb的doc的時候,但凡出現shecma字段的,其值都會自動新增個 $id:null 的值

後來使用go,來複制,避免了該問題

package main

import (
	"context"
	"fmt"
	"log"
	"time"

	"go.mongodb.org/mongo-driver/bson"
	"go.mongodb.org/mongo-driver/mongo"
	"go.mongodb.org/mongo-driver/mongo/options"
	"go.mongodb.org/mongo-driver/mongo/readpref"
)

func main() {

	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
	defer cancel()

	// 設置客戶端連接配置
	client, err := mongo.Connect(ctx, options.Client().ApplyURI("mongodb://admin:admin%[email protected]:27017/"))

	if err != nil {
		log.Fatal(err)
	}

	// 檢查連接
	err = client.Ping(ctx, readpref.Primary())
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("Connected to MongoDB!")
	// Make sure to defer a call to Disconnect after instantiating your client:
	defer func() {
		if err = client.Disconnect(ctx); err != nil {
			panic(err)
		}
	}()

	// 指定獲取要操作的數據集
	collection := client.Database("iiapp").Collection("com_api")

	// 目標collection
	targetColl := client.Database("iiapp_test").Collection("com_api")

	// 查找記錄
	cur, err := collection.Find(ctx, bson.D{})
	if err != nil {
		log.Fatal(err)
	}
	defer cur.Close(ctx)

	for cur.Next(ctx) {
		var result bson.M
		if err := cur.Decode(&result); err != nil {
			log.Fatal(err)
		}
		// fmt.Printf("result:   %v", result)

		_, err := targetColl.InsertOne(ctx, result)
		if err != nil {
			log.Fatal(err)
		}

	}

	if err := cur.Err(); err != nil {
		log.Fatal(err)
	}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章