2014-05-06 46 views
2

我正在與mgo一起使用MongoDB和Go。我有以下代碼:如何從地圖中檢索價值 - 去朗?

func Find(collectionName, dbName string, query interface{}) (result []interface{}, err error) { 
    collection := session.DB(dbName).C(collectionName) 
    err = collection.Find(query).All(&result) 
    return result, err 
} 

func GetTransactionID() (id interface{}, err error) { 
    query := bson.M{} 
    transId, err := Find("transactionId", dbName, query) 
    for key, value := range transId { 
     fmt.Println("k:", key, "v:", value) 
    } 
} 

Output: K:0ν:地圖[_id:ObjectIdHex( 「536887c199b6d0510964c35b」)TRANSID:A000000000]

我需要從地圖得到的_idtransId值從Find切片中返回的值。我怎樣才能做到這一點?

+0

通過Go tour你的方式http://tour.golang.org/#1首先。提示:'transId'是一個slice(有點數組),因此映射爲元素0,所以你現在可能想要'm:= transId [0]'現在'm'是映射,元素可以像'm [ 「_id」]'和'm [「transID」]'。 – Volker

+0

@Volker謝謝我曾嘗試過。錯誤是無效操作:m [「_ id」](接口類型的索引{}) – karthick

+2

您將不得不顯示整個代碼。猜測地圖的類型是不可能的。如果你無法弄清楚你的地圖是什麼類型的話,可以嘗試使用'%+ v'和/或'%#v'打印這些東西。 – Volker

回答

7

我只是猜測,但如果你只是想檢索所有交易文件,並打印出來 - 這裏是如何:

鑑於你代表你的收藏如的文件結構的struct

type Transaction struct { 
    Id   bson.ObjectId `bson:"_id"` 
    TransactionId string  `bson:"transId"` 
} 

您可以獲取使用MongoDB的驅動程序(MgO)的所有文件:

var transactions []Transaction 
err = c.Find(bson.M{}).All(&transactions) 
// handle err 
for index, transaction := range transactions { 
    fmt.Printf("%d: %+v\n", index, transaction) 
} 

加法(通用解決方案)

好吧,在您提供了一些更多的見解後,這可能是一個不使用結構的通用解決方案。嘗試編入一個BSON文檔bson.M(未經測試):

var data []bson.M 
err := c.Find(bson.M{}).All(&data) 
// handle err 
for _, doc := range data { 
    for key, value := range doc { 
    fmt.Println(key, value) 
    } 
}  
+0

我認爲就是這樣,文檔說它會填充傳入的正確類型的數據片,因爲它不是[] struct {bson.ObjectID;字符串}它用包含所有事務的單個映射[bson.ObjectID]字符串替換它。 – LinearZoetrope

+0

謝謝。我無法在mongoDB查詢中指定結構。因爲我們正在爲項目使用通用的dbengine。所以err = c.Find(bson.M {})。All(&result)。結果類型是[] interface {}。 – karthick

+0

@ karthick.k檢查這是否適用於您的用例 – Sebastian