利用mgo,批量修改 mongodb 中的表記錄

需求:

寫一個版本升級腳本,腳本中要修改數據庫結構。

上一個版本,數據庫所有記錄用一個叫“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}})
}

 

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