2014-10-24 3 views
3

저는 현재 GoLang과 MongoDB로 시작하고 있습니다. 좀 더 구체적 인 블로그 인 작은 웹 응용 프로그램을 작성하고 있습니다. (새로운 언어를 사용해 보았을 때 처음 작성한 webapp와 같습니다). 처음에는 몇 가지 문제가 있더라도 MGO로 모든 것이 잘 작동합니다. 하지만 이제는 각 블로그 항목에 액세스하고 싶습니다. 기사는 별도로 내 모델과 연결되는 항목으로 참조됩니다. URL에 ObjectID를 사용할 수 있습니다. 그러나 그것은 추한 추한 것이다. 예 :
mydomain.com/entries/543fd8940e82533995000002/
사용자에게 친숙하지 않습니다. 나는 적절한 ID를 사용할 수있는 다른 데이터베이스 엔진을 사용하기 때문에 적절한 솔루션을 찾기 위해 인터넷에서 많은 연구를했다.Mgo로 사용자 정의 ID 만들기

새 항목을 삽입 할 때 자동 증가하는 사용자 정의 (공개) ID 생성에 도움을 줄 수 있고 URL에 사용할 수 있습니까? 여기

지금은 내 모델의 코드입니다 :

package models 

import (
    "time" 

    "labix.org/v2/mgo" 
    "labix.org/v2/mgo/bson" 
) 

type (
    Entries []Entry 
    Entry struct { 
     ID  bson.ObjectId `bson:"_id,omitempty"` 
     Title string  `bson:"title"` 
     Short string  `bson:"short"` 
     Content string  `bson:"content"` 
     Posted time.Time  `bson:"posted"` 
    } 
) 

// Insert an entry to the database 
func InsertEntry(database *mgo.Database, entry *Entry) error { 
    entry.ID = bson.NewObjectId() 
    return database.C("entries").Insert(entry) 
} 

// Find an entry by id 
func GetEntryByID(database *mgo.Database, id string) (entry Entry, err error) { 
    bid := bson.ObjectIdHex(id) 
    err = database.C("entries").FindId(bid).One(&entry) 
    return 
} 

// Retrieves all the entries 
func AllEntries(database *mgo.Database) (entries Entries, err error) { 
    err = database.C("entries").Find(nil).All(&entries) 
    return 
} 

// Retrieve all the entries sorted by date. 
func AllEntriesByDate(database *mgo.Database) (entries Entries, err error) { 
    err = database.C("entries").Find(nil).Sort("-posted").All(&entries) 
    return 
} 

// Counts all the entries. 
func CountAllEntries(database *mgo.Database) (count int, err error) { 
    count, err = database.C("entries").Find(nil).Count() 
    return 
} 
+0

당신은 객체가 추가로 증가 필드를 저장하는 분리 수거를 유지해야합니다. Mongo 측에서 전적으로 이것을 처리 할 수있는 Javascript로 함수를 작성하는 한 그것은 그렇게 나쁘지 않습니다. 그렇지 않으면 Go에서 먼저 검색하고 문서를 증가시키기 전에 증분 ​​값을 사용해야합니다. –

답변

2

당신이 _id는 필수 항목입니다 알다시피, 당신이 그것을 설정하지 않는 때 자동으로 드라이버가 입력된다. 이것은 현재 응용 프로그램/코드에있는 동작입니다. 이 유형 및 해당 세대에 대한 정보는 여기에서 확인할 수 있습니다. http://docs.mongodb.org/manual/reference/object-id/

그러나 자신의 _id를 만들고 비즈니스에 적합한 값으로 설정할 수 있습니다.

나는 다음과 같은 문장 이해하지 못하는입니다 이유는 : 난 그냥 (ID를 사용할 수있는 다른 데이터베이스 엔진을 사용하기 때문에

를 내가 적절한 해결책을 찾기 위해 인터넷에 대한 연구를 많이했다 그리고 그것은 괜찮을 것이다).

컬렉션에 고유 한 값을 사용할 수 있습니다.

자동 증가에 대해 MongoDB는 자동 증가 필드를 제공하지 않으므로 직접 구현해야하며 응용 프로그램에서 증가분을 호출해야합니다.

예를 들어 당신이 당신의 "시퀀스/카운터"를 포함하는 새 컬렉션을 만들 : (보여주는 쉘 가지 명령을)

{ 
    _id : "entry", 
    sequence : 0 
} 

그런 다음 업데이트 먼저이 문서에 대한 새로운 ID를 할 때, 간단한 $ inc 연산으로 작성한 문서를 수정하고 수정하십시오.

var ret = db.counters.findAndModify(
      { 
      query: { _id: "entry" }, 
      update: { $inc: { seq: 1 } }, 
      new: true 
      } 
    ); 

그런 다음 반환 된 값을 새 문서에 _id로 사용할 수 있습니다.

이 패턴은 여기에 설명되어 있습니다 : http://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/

+1

이것을 위해 Go 구현을 사용하고 싶습니다. 나는 그것이 가능하다는 것을 확신한다 ... – Depado

+1

물론 Go 구현을 사용할 수있다. 앱 시작시 가장 높은 'id'값을 쿼리하고 항목이 삽입 될 때 추적해야한다. 그래도 몽고가 처리하도록하면 더 좋을 것 같아. –

+3

@Depado [Query Apply 메소드] (http://godoc.org/gopkg.in/mgo.v2#Query.Apply)에 대한 설명서에는 mgo를 사용하여 카운터를 구현하는 방법이 나와 있습니다. –