首頁 > 後端開發 > Golang > 如何正確建立mongo模型和客戶端?

如何正確建立mongo模型和客戶端?

PHPz
發布: 2024-02-09 08:30:10
轉載
1165 人瀏覽過

如何正確建立mongo模型和客戶端?

php小編蘋果將為你介紹如何正確建立mongo模型和客戶端。在使用MongoDB進行開發時,建立模型和客戶端是非常重要的一步,它們決定了你在後續操作中的靈活性和效率。首先,你需要透過安裝MongoDB擴充功能來啟用MongoDB支援。然後,你可以使用MongoDB提供的API來建立模型和客戶端。建立模型時,你需要定義集合名稱、欄位和索引等相關資訊。建立客戶端時,你需要指定MongoDB的連線訊息,如主機名稱、連接埠號碼和認證資訊等。透過正確建立模型和客戶端,你將能夠更好地操作MongoDB資料庫,提高開發效率和程式碼品質。

問題內容

我有一個模型想要插入並從 mongodb 讀取:

type TripFeedback struct {
    ID        primitive.ObjectID `json:"_id" bson:"_id"`
    UserID    string             `json:"user_id" bson:"user_id"`
    WaybillID uint64             `json:"waybill_id" bson:"waybill_id"`
    Rating    Rating             `json:"rating" bson:"rating"`
    Comment   string             `json:"comment" bson:"comment"`
    CreatedAt time.Time          `json:"created_at" bson:"created_at"`
}
登入後複製

我希望 ID 欄位在 mongo 內部自動遞增,所以我將 ID 欄位保留為空:

feedback := model.NewTripFeedback(
        createRequest.UserID,
        createRequest.WaybillID,
        rating,
        createRequest.Comment,
        createRequest.ReceivedAt,
    )
    _, err = r.collection.Create(ctx, feedback)
登入後複製

此外,在建立儲存庫時,我這樣做:

// NewFeedbackRepository connects to mongo db and feedback collection.
func NewFeedbackRepository(ctx context.Context, client *mongo.Client) (*FeedbacksRepository, error) {
    r := FeedbacksRepository{
        c:       client.Database(dbName).Collection(feedbackCollectionName),
        metrics: NewMetrics(),
    }
    if err := r.migrate(ctx); err != nil {
        return nil, err
    }
    return &r, nil
}

// migrate ensures presence of dossier collection in database.
func (r *FeedbacksRepository) migrate(ctx context.Context) error {
    mdb := r.c.Database()
    cs, lcErr := mdb.ListCollectionNames(ctx, bson.M{"name": feedbackCollectionName})
    if lcErr != nil {
        return fmt.Errorf("migrate: list collections error: %w", lcErr)
    }
    if len(cs) == 0 {
        if err := mdb.CreateCollection(ctx, feedbackCollectionName); err != nil {
            return fmt.Errorf("migrate: create collection error: %w", err)
        }
    }
    return nil
}
登入後複製

你能告訴我我做錯了什麼嗎?我還沒有真正理解如何正確使用 mongo db 中的 _id 欄位。我希望它在 mongo 內部創建和處理

write errors
: [E11000 duplicate key error collection: drive.feedback index: _id_ dup key: { _id: ObjectId('000000000000000000000000') }]"
登入後複製

解決方法

如果未傳入,MongoDB 將產生 ID。在您的結構中,您傳入的 ID 全部為零。

您可以做兩件事:

您可以自己產生它:

feedback := model.NewTripFeedback(
        ID: primitive.NewObjectID(),
        createRequest.UserID,
登入後複製

或者,您沒有將其傳入:

type TripFeedback struct {
    ID        *primitive.ObjectID `json:"_id" bson:"_id,omitempty"`
    UserID    string             `json:"user_id" bson:"user_id"`
    ...
登入後複製

然後,如果不初始化ID,則會產生ID。

以上是如何正確建立mongo模型和客戶端?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板