我有一個項目,是將從各個微服務聚合來的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)
}
}