2015-10-14 205 views
2

我是mongodb和golang的新手。在我的一個項目中,我想連接mongo和go。我正在使用mgo.v2驅動程序將mongo與go連接。我的問題是: 如何自動遞增我的文檔的_id字段,以便每當我嘗試執行POST操作時,它應自動遞增文檔的_id字段? 我想實現類似於「FindAndModify」功能的東西,但我沒有看到這個功能。 這就是我想去嘗試。 Auto increment id in mongodb如何使用golang mgo驅動程序自動增加mongodb的id字段?

type count struct { 
     ID string `bson:"_id"` 
     Seq int `bson:"seq"` 
    } 

    var doc count 

    func get NextSequence(name string) int{ 
    change := mgo.Change{ 
      Update: collection.Update(count{ID: "userid"}, bson.M{"$inc": count{Seq: 1}}), 
      ReturnNew: true, 
     } 

     _, err1 := collection.Find(bson.M{}).Apply(change, &doc) 
     return doc.Seq 
    } 

    func main(){ 
     fmt.Println(getNextSequence("userid")) 
     fmt.Println(getNextSequence("userid")) 
     doc2 := msg{ID: getNextSequence("userid"), Name: "Sarah"} 
     doc3 := msg{ID: getNextSequence("userid"), Name: "Sarah2"} 
    } 

我嘗試了上面的代碼,但序列的價值似乎並不increment.It給我0每次我做的函數的調用。 感謝您的幫助。

+1

自動增加MongoDB中往往是一個不好的做法,因爲它沒有很好地擴展。它有點挫敗了使用它的目的。有一個原因,爲什麼默認不是自動遞增的主鍵值。有沒有什麼你想到的只能通過自動遞增ID來實現? –

+0

我完全同意@WillC。此外:'_id'是不可變的。當你「改變」它時,你可以有效地創建一個新文檔。如果你確實需要一個計數器(例如用於樂觀鎖定),則應該在* not *'_id'字段使用'$ inc'運算符。 –

回答

2

根據mgo軟件包文檔,您可以使用Query.Apply。我還沒有嘗試過自己,但給出的例子似乎也已經做你想要達到的目標:

change := mgo.Change{ 
     Update: bson.M{"$inc": bson.M{"n": 1}}, 
     ReturnNew: true, 
} 
info, err = col.Find(M{"_id": id}).Apply(change, &doc) 
fmt.Println(doc.N) 
+0

我試過同樣的事情,但該領域似乎並沒有增加。 –

+0

幫了我很多!謝謝! – deepakssn

1

嘗試下面的一個

聲明一個更變量名var total_doc int'

然後做collection.Find(bson.M{}).Count(total_doc)這將返回您在您的mongodb數據庫中擁有的文檔總數。

添加後doc.Seq = total_doc + 1。每當添加新文檔時,這將繼續遞增序列值。

希望這可以幫助你

0

可能會晚點,但你也可以使用night-codes/mgo-ai包來管理您的序列。

我個人使用過這個,我創建了一個單獨的sequences集合來存儲遞增的值。我還保留了_id字段,併爲我的sequence值設置了單獨的id字段。

從它README.md

package main 

    import (
     "github.com/night-codes/mgo-ai" 
     "gopkg.in/mgo.v2" 
     "gopkg.in/mgo.v2/bson" 
    ) 

    func main() { 
     session, err := mgo.Dial("localhost") 
     if err != nil { 
      panic(err) 
     } 

     // connect AutoIncrement to collection "counters" 
     ai.Connect(session.DB("example-db").C("counters")) 

     // ... 

     // use AutoIncrement 
     session.DB("example-db").C("users").Insert(bson.M{ 
      "_id": ai.Next("users"), 
      "login": "test", 
      "age": 32, 

    } 
相關問題