


Comment travailler avec des bases de données NoSQL comme MongoDB à Golang
Installez le pilote MongoDB GO et utilisez Mongo.Connect () pour établir une connexion pour s'assurer que la connexion réussit via Ping; 2. Définissez une structure GO avec la balise BSON pour mapper les documents MongoDB, utilisez éventuellement primitive.Objectid comme type d'ID; 3. Utilisez INSERTOne pour insérer un seul document, FindOne Requête un seul document et gérer les erreurs Mongo.ErrnoDocuments, UpdateOne met à jour le document, DeleteOne supprime le document, Find Coopera avec Cursor.tall pour obtenir plusieurs documents; 4. Utilisez toujours le contexte avec le délai d'expiration pour éviter la demande de demande, réutilisez les instances des clients MongoDB, utilisez BSON.M, BSON.D et BSON.A raisonnablement, créer des index uniques pour les champs de requête courants pour améliorer les performances, et activer TLS et l'authentification dans les environnements de production - l'utilisation de MongoDB dans GO peut obtenir des connexions NOSQL efficaces et maintenables et des opérations de modélisation correcte par des données multiples, des erreurs de contexte, des erreurs de contexte.
Travailler avec des bases de données NoSQL comme MongoDB dans Go (Golang) est simple grâce au Strong Support de MongoDB GO et GO de GO officiel pour la gestion des données basée sur Struct. Voici un guide pratique sur la façon d'intégrer et d'utiliser efficacement MongoDB dans une application Go.

1. Configurez le pilote MongoDB GO
Tout d'abord, installez le pilote officiel de MongoDB GO:
Allez Get Go.mongodb.org/mongo-driver/mongo Allez Get Go.mongodb.org/mongo-driver/mongo/options
Ces packages fournissent des outils pour se connecter à MongoDB, exécuter des requêtes et gérer des options telles que la mise en commun des connexions et les délais d'attente.

2. Connectez-vous à MongoDB
Utilisez mongo.Connect()
pour établir une connexion. Vous le ferez généralement une fois au démarrage.
package principal importer ( "contexte" "FMT" "enregistrer" "temps" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" ) func main () { // Définir les options du client ClientOptions: = OptionS.Client (). ApplyUri ("MongoDB: // LocalHost: 27017") // Connectez-vous à MongoDB Client, err: = Mongo.Connect (context.todo (), clientoPtions) Si err! = Nil { log.fatal (err) } // Vérifiez la connexion ctx, annuler: = context.withtimeout (context.background (), 10 * time.second) Déférer annuler () err = client.ping (ctx, nil) Si err! = Nil { Log.fatal ("Échec de Ping MongoDB:", ERR) } fmt.println ("connecté à MongoDB!") // utilise le client pour les opérations Collection: = Client.Database ("MyDB"). Collection ("utilisateurs") // insérer, requête, etc. allez ici // Déconnectez-vous une fois terminé (généralement différé dans les applications réelles) si err = client.disconnect (ctx); err! = Nil { log.fatal (err) } }
Astuce : En production, stockez le
client
à l'échelle mondiale ou injectez-le par injection de dépendance. Ne vous reconnectez pas pour chaque demande.
3. Définir les modèles de données à l'aide de structures
GO utilise des structures pour mapper sur des documents mongoDB. Utilisez des balises bson
pour contrôler comment les champs sont sérialisés.
Tapez user struct { ID String `bson:" _ id, omitempty "` Nom String `BSON:" Name "` Chaîne de messagerie `bson:" e-mail "` Âge int `bson:" âge "` Bool actif `bson:" actif, omitempty "" }
- La balise
bson
explique au conducteur comment mapper les champs de structure aux clés de document MongoDB. -
_id
avecomitempty
permet à MongoDB de générer automatiquement un objetId s'il n'est pas fourni. - Utilisez
primitive.ObjectID
dego.mongodb.org/mongo-driver/bson/primitive
si vous voulez des ID typés.
Exemple avec ObjectId:
Importer "go.mongodb.org/mongo-driver/bson/primitive" Tapez user struct { Id primitive.objectid `bson:" _ id, omitempty "` Nom String `BSON:" Name "` Chaîne de messagerie `bson:" e-mail "` }
4. Effectuer des opérations CRUD
Insérer un document
utilisateur: = utilisateur { Nom: "Alice", Courriel: "Alice@example.com", Âge: 30 ans, } Résultat, err: = collection.insertOne (context.todo (), utilisateur) Si err! = Nil { log.fatal (err) } fmt.printf ("document inséré avec id:% v \ n", result.insertEDID)
Trouver un document
Var FoundUser utilisateur Filtre: = BSON.M {"Courriel": "Alice@example.com"} err = Collection.FindOne (context.todo (), filtre) .decode (& FoundUser) Si err! = Nil { Si err == Mongo.errnodocuments { fmt.println ("aucun document trouvé") } autre { log.fatal (err) } } autre { fmt.printf ("Found:% v \ n", FoundUser) }
Mettre à jour un document
Mise à jour: = bson.m {"$ set": bson.m {"age": 31}} Résultat, err: = collection.updateOne (context.todo (), filtre, mise à jour) Si err! = Nil { log.fatal (err) } fmt.printf ("Modified% v documents \ n", result.modifiedCount)
Supprimer un document
Résultat, err: = collection.deleteOne (context.todo (), filtre) Si err! = Nil { log.fatal (err) } fmt.printf ("Document (s) \ n" supprimé% V
Trouver plusieurs documents
curseur, err: = collection.find (context.todo (), bson.m {"age": bson.m {"$ gt": 25}}) Si err! = Nil { log.fatal (err) } déférer curseur.close (context.todo ()) Var utilisateurs [] utilisateur si err = cursor.all (context.todo (), & utilisateurs); err! = Nil { log.fatal (err) } pour _, u: = gamme utilisateurs { fmt.printf ("% v \ n", u) }
5. Gérer correctement les erreurs et le contexte
Utilisez toujours le contexte avec les délais d'attente pour éviter les opérations suspendues:
ctx, annuler: = context.withtimeout (context.background (), 5 * time.second) Déférer annuler () err = collection.findOne (ctx, filtre) .decode (& user)
Vérifiez explicitement mongo.ErrNoDocuments
lorsque vous recherchez des documents uniques.
6. Utiliser les index pour les performances
Vous pouvez créer des index programmaticalement:
indexModel: = Mongo.IndexModel { Touches: bson.d {{"e-mail", 1}}, Options: OptionS.Index (). SetUnique (true), } _, err: = collection.indexes (). createOne (context.todo (), indexmodel) Si err! = Nil { log.fatal (err) }
7. meilleures pratiques
- Réutilisez le client : le pilote MongoDB GO est en file d'attente. Créez un client au démarrage et réutilisez-le.
- Utilisez BSON.M, BSON.D, BSON.A :
-
bson.M
- carte non ordonnée -
bson.D
- Document commandé (utile pour les opérations où la commande est importante) -
bson.A
- tableau
-
- Valider l'entrée avant l'insertion.
- Utilisez la journalisation structurée et surveillez les requêtes lentes.
- Activer TLS et authentification dans la production.
Travailler avec MongoDB dans GO est naturel en raison de la frappe forte de Go et de l'API propre du conducteur. Avec une modélisation de structure appropriée et une gestion de contexte, vous pouvez créer des applications évolutives et maintenables qui exploitent la flexibilité de Nosql.
Fondamentalement, connectez-vous une fois, modélisez vos données, utilisez des structures avec des balises BSON et appliquez des modèles CRUD standard - il n'est pas complexe, mais facile de se tromper sans attention au contexte et à la gestion des erreurs.
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!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

TointegrategolangServices withexistingpythoninfrastructure, userestapisorgrpcForInter-Servicecommunication, permettant à la perfection

GolangoffersSuperiorPerformance, nativeConcaunternandViagoroutines, and efficaceResourceUsage, faisant la provision de la trafic, low-lantentencyapis; 2.python, tandis que la locosystème de lavel

GoussessIgnifancelylessmemorythanpythonwhenrunningwebservicesduetolanguagedesignandconcurrencyModeldiFferences.1.go'sgoroutinesaarelightweight withminimalstackoverhead, permest efficace

PythonisthedominantLanguageFormAphineLearningDuetOtsmatureCosystem, tandis que les gorgés de poids limité

La différence de base entre Go et Python dans la gestion de la mémoire est les différents mécanismes de collecte des ordures. GO utilise la dédouanement concurrent (MarkandSweep) GC, qui s'exécute automatiquement et exécute simultanément avec la logique du programme, traite effectivement des références circulaires. Il convient aux scénarios de concurrence élevés, mais ne peut pas contrôler avec précision le temps de recyclage; tandis que Python repose principalement sur le comptage de référence et les références d'objets sont immédiatement publiées lorsqu'elles sont à zéro. L'avantage est qu'il s'agit d'un recyclage instantané et d'une implémentation simple, mais il y a un problème de référence circulaire, ils doivent donc utiliser le module GC pour aider au nettoyage. Dans le développement réel, GO est plus adapté aux programmes de serveurs haute performance, tandis que Python convient aux classes de script ou aux applications avec des exigences de performance faibles.

Lors de la création d'outils de ligne de commande pour la distribution, Golang est plus approprié que Python. Les raisons comprennent: 1. Distribution simple et un seul fichier binaire statique est généré après les compléments GO, sans dépendances supplémentaires; 2. 3. Prend en charge la compilation multiplateforme, aucun outil d'emballage supplémentaire n'est requis et des fichiers exécutables de différentes plates-formes peuvent être générés avec des commandes simples. En revanche, Python nécessite l'installation de bibliothèques d'exécution et de dépendance, qui sont lentes à démarrer, des processus d'emballage complexes, et sujets à la compatibilité et aux faux positifs, il n'est donc pas aussi bon qu'en termes d'expérience de déploiement et de coûts de maintenance.

Le cœur de la migration vers l'architecture des microservices de Golang est de clarifier les limites du service, de sélectionner les modes de communication, de gérer les flux de données et d'optimiser la surveillance du déploiement. Premièrement, les services indépendants sont définis en identifiant les limites de la logique métier telles que la gestion des utilisateurs, le paiement et d'autres modules, et les principes de cohésion élevée et de couplage faible et de conception axés sur le domaine sont suivis; Deuxièmement, les files d'attente REST, GRPC ou de messages sont sélectionnées comme méthodes de communication selon les besoins, tels que l'utilisation de notifications asynchrones de l'événement au lieu d'appels directs; Ensuite, chaque service gère indépendamment la base de données et échange des données via l'API ou l'événement, et utilise CQRS ou SAGA pour traiter les transactions distribuées; Enfin, les services de contenerisation Docker et d'orchestration et de déploiement de Kubernetes sont utilisés pour combiner les journaux, les métriques et les outils de suivi pour obtenir une observabilité complète.

Une interface n'est pas un type de pointeur, il contient deux pointeurs: type dynamique et valeur. 1. La variable d'interface stocke le descripteur de type et le pointeur de données du type spécifique; 2. Lors de l'attribution du pointeur à l'interface, il stocke une copie du pointeur et l'interface elle-même n'est pas un type de pointeur; 3. Si l'interface est nulle, le type et la valeur sont jugés en même temps; 4. Lorsque le récepteur de méthode est un pointeur, seul le type de pointeur peut réaliser l'interface; 5. Dans le développement réel, faites attention à la différence entre la copie de valeur et le transfert de pointeur de l'interface. La compréhension peut éviter les erreurs d'exécution et améliorer la sécurité du code.
