Maison  >  Article  >  développement back-end  >  Comment créer correctement un modèle mongo et un client ?

Comment créer correctement un modèle mongo et un client ?

PHPz
PHPzavant
2024-02-09 08:30:101108parcourir

Comment créer correctement un modèle mongo et un client ?

L'éditeur PHP Apple vous présentera comment créer correctement des modèles et des clients mongo. Lors du développement avec MongoDB, la création de modèles et de clients est une étape très importante, car ils déterminent votre flexibilité et votre efficacité dans les opérations ultérieures. Tout d'abord, vous devez activer la prise en charge de MongoDB en installant l'extension MongoDB. Vous pouvez ensuite utiliser l'API fournie par MongoDB pour créer des modèles et des clients. Lors de la création d'un modèle, vous devez définir des informations pertinentes telles que les noms de collections, les champs et les index. Lors de la création d'un client, vous devez spécifier les informations de connexion MongoDB, telles que le nom d'hôte, le numéro de port et les informations d'authentification. En créant correctement des modèles et des clients, vous serez en mesure de mieux exploiter la base de données MongoDB et d'améliorer l'efficacité du développement et la qualité du code.

Contenu de la question

J'ai un modèle que je souhaite insérer et lire depuis 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"`
}

Je veux que le champ ID soit auto-incrémenté dans mongo, donc je laisse le champ ID vide :

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

De plus, lors de la création du référentiel, je fais ceci :

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

Pouvez-vous me dire ce que j'ai fait de mal ? Je n'ai pas vraiment compris comment utiliser correctement le champ _id dans la base de données mongo. Je veux qu'il soit créé et géré à l'intérieur de mongo

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

Solution de contournement

S'il n'est pas transmis, MongoDB générera l'ID. Dans votre structure, les identifiants que vous transmettez sont tous des zéros.

Vous pouvez faire deux choses :

Vous pouvez le générer vous-même :

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

Ou, vous ne l'avez pas transmis :

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

Ensuite, si l'ID n'est pas initialisé, l'ID sera généré.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer
Article précédent:Héritage en GoArticle suivant:Héritage en Go