我有一个项目,是将从各个微服务聚合来的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)
}
}