這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
測試完mgo中的DBRef後,想接著測試指定欄位的顯示,才發現原來採用架構編碼,很多問題被隱藏了起來:
1.顯示指定欄位:
之前在使用mgo時一直是查詢全部欄位,在mongo終端環境寫為如下格式:
> db.logs.find({},{"log":1}){ "_id" : "3a06384a40a8e587806f194c6c80253e", "log" : "這是一個測試日誌" }{ "_id" : "36bb718040a4362b8035ebd822125dba", "log" : "這是一個測試日誌" }
為了保證只顯示log內容,需要去掉id顯示,則寫成這樣
> db.logs.find({},{"_id":0,"log":1}){ "log" : "這是一個測試日誌" }{ "log" : "這是一個測試日誌" }
在golang中的mgo寫法卻需要藉助mgo中的select()方法實現,代碼如下:
err = d.Find(bson.M{}).Select(bson.M{"log": 1}).All(&result1)
結果如下:
[ `run` | done: 342.828631ms ][{b5e57fed409eab8e804e17088b1fdaae 這是一個測試日誌 { <nil> } 0001-01-01 00:00:00 +0000 UTC} {261e7fe9402c6842807092e7f0df61ce 這是一個測試日誌 { <nil> } 0001-01-01 00:00:00 +0000 UTC}
去掉id顯示:
err = d.Find(bson.M{}).Select(bson.M{"log": 1, "_id": 0}).All(&result1)
結果
{ 這是一個測試日誌 { <nil> } 0001-01-01 00:00:00 +0000 UTC} { 這是一個測試日誌 { <nil> } 0001-01-01 00:00:00 +0000 UTC}
嗯.....如果想只顯示一個欄位,我現在的辦法是進行迴圈輸出.
for i := 0; i < len(result1); i++ {fmt.Println(result1[i].Log)}
參考:mgo如何返回部分field?
2.查詢ID的值:
在mongo終端很簡單:
> db.logs.find({},{"_id":1}){ "_id" : "3a06384a40a8e587806f194c6c80253e" }{ "_id" : "36bb718040a4362b8035ebd822125dba" }
在mgo下卻查不出來?問題在struct中
//錯誤寫法type Log struct {LogId stringLog stringLogUser mgo.DBRefInserted time.Time}//正確寫法type Log struct {LogId string `bson:"_id"`Log stringLogUser mgo.DBRefInserted time.Time}
再查詢ID沒有問題了:),注意查的時間是查"_id"而不是logid
err = d.Find(bson.M{}).Select(bson.M{"_id": 1}).All(&result1)
結果:
{32197b67400e229f8017fd8258c2f700 { <nil> } 0001-01-01 00:00:00 +0000 UTC}
{e7dda7b34052584280ef55f49b16eb2c { <nil> } 0001-01-01 00:00:00 +0000 UTC}
參考:mgo 如何根據指定的 _id 查詢到結果啊?