Heim  >  Artikel  >  Backend-Entwicklung  >  Wie erstelle ich ein Mongo-Modell und einen Client richtig?

Wie erstelle ich ein Mongo-Modell und einen Client richtig?

PHPz
PHPznach vorne
2024-02-09 08:30:101108Durchsuche

Wie erstelle ich ein Mongo-Modell und einen Client richtig?

PHP-Editor Apple stellt Ihnen vor, wie Sie Mongo-Modelle und -Clients richtig erstellen. Bei der Entwicklung mit MongoDB ist die Erstellung von Modellen und Clients ein sehr wichtiger Schritt, da sie Ihre Flexibilität und Effizienz im späteren Betrieb bestimmen. Zunächst müssen Sie die MongoDB-Unterstützung aktivieren, indem Sie die MongoDB-Erweiterung installieren. Anschließend können Sie die von MongoDB bereitgestellte API verwenden, um Modelle und Clients zu erstellen. Beim Erstellen eines Modells müssen Sie relevante Informationen wie Sammlungsnamen, Felder und Indizes definieren. Beim Erstellen eines Clients müssen Sie MongoDB-Verbindungsinformationen angeben, z. B. Hostnamen, Portnummer und Authentifizierungsinformationen. Durch die korrekte Erstellung von Modellen und Clients können Sie die MongoDB-Datenbank besser betreiben und die Entwicklungseffizienz und Codequalität verbessern.

Frageninhalt

Ich habe ein Modell, das ich einfügen und aus mongodb lesen möchte:

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"`
}

Ich möchte, dass das ID-Feld in Mongo automatisch erhöht wird, also lasse ich das ID-Feld leer:

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

Außerdem mache ich beim Erstellen des Repositorys Folgendes:

// 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
}

Kannst du mir sagen, was ich falsch gemacht habe? Ich habe nicht wirklich verstanden, wie man das _id-Feld in Mongo DB richtig verwendet. Ich möchte, dass es in Mongo erstellt und verarbeitet wird

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

Workaround

Wenn nicht übergeben, generiert MongoDB die ID. In Ihrer Struktur sind die von Ihnen übergebenen IDs alle Nullen.

Sie können zwei Dinge tun:

Sie können es selbst generieren:

feedback := model.NewTripFeedback(
        ID: primitive.NewObjectID(),
        createRequest.UserID,

Oder Sie haben es nicht weitergegeben:

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

Wenn die ID dann nicht initialisiert ist, wird die ID generiert.

Das obige ist der detaillierte Inhalt vonWie erstelle ich ein Mongo-Modell und einen Client richtig?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen
Vorheriger Artikel:Vererbung in GoNächster Artikel:Vererbung in Go