需求:
寫一個版本升級腳本,腳本中要修改數據庫結構。
上一個版本,數據庫所有記錄用一個叫“key”的字段作爲key
升級後的版本,把key 寫到_id 裏面去。這樣就可以作爲唯一主鍵和 索引,從而提高性能。
困難點:
在網上找到的mgo,到數據庫裏面查到數據後,都是用struct來接受。這樣我就要定義無數個struct,很明顯不實際。
由於我現在要修改的東西是修改的是_id,所以無法用 update 來實現。要有這幾步:
1、查記錄
2、把key賦值給_id,同時刪除key
3、把這個新記錄插入表中
4、把原來的記錄刪除
經過閱讀源碼,發現struct並非唯一可以接受查詢結果的方法,map也可以。如下是核心代碼:
func handleSingleCollection(db *mgo.Database, collectionName string) {
fmt.Println("Handling collecitonName: " + collectionName)
var docs []map[string]interface{}
coll := db.C(collectionName)
count, _ := coll.Count()
fmt.Println("collecitonName total records count: ", count)
coll.Find(bson.M{"key": bson.M{"$exists": true}}).Select(bson.M{}).All(&docs)
fmt.Println("collecitonName handling records count: ", len(docs))
for _, doc := range docs {
doc["_id"] = doc["key"]
delete(doc, "key")
//
coll.Insert(doc)
}
coll.RemoveAll(bson.M{"key": bson.M{"$exists": true}})
}