2015-10-14 2 views
2

Я новичок в mongodb и golang. В одном из моих проектов я хочу подключить монго с помощью go. Я использую драйвер mgo.v2 для подключения монго с go. Мой вопрос: Как я могу автоматически увеличивать поле _id моего документа, чтобы всякий раз, когда я пытаюсь выполнить операцию POST, он должен автоматически увеличивать поле _id документа? Я хочу реализовать что-то похожее на функцию «FindAndModify», но я не вижу эту функцию в go. Это то, что я хочу попробовать. Auto increment id in mongodbКак автоматически увеличивать поле id mongodb с помощью golang mgo driver?

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, как правило, плохая практика, потому что это не очень хорошо масштабируется. Это отчасти поражает цель его использования. Существует причина, по которой значение по умолчанию не является значением с автоматическим повышением первичного ключа. Есть ли что-то, что вы имеете в виду, чего хотите достичь, это может быть сделано только путем автоматического увеличения значений идентификаторов? –

+0

Я больше не мог согласиться с @WillC. Кроме того: '_id' является неизменным. Когда вы «изменяете» его, вы фактически создаете новый документ. В случае, когда вам действительно нужен счетчик (например, для оптимистической блокировки), вы должны использовать оператор '$ inc' в поле, которое не является *' _id'. –

ответ

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 и имел отдельное поле id для моего значения sequence.

От его 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, 

    }