Mongo db with C#

5,105 views
4,922 views

Published on

Mongo db / C# cas du site www.citizart.com

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
5,105
On SlideShare
0
From Embeds
0
Number of Embeds
79
Actions
Shares
0
Downloads
38
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Mongo db with C#

  1. 1. Mongo db/ C# / Linq cas du site www.citizart.com<br />Erwan de Cadoudal le 23 mars 2011<br />
  2. 2. Agenda<br />Contexte du site CitizArt<br />Utilisation de Mongo db<br />Exemples de code simples<br />Evolutions<br />
  3. 3. Agenda<br />Contexte du site CitizArt<br />Utilisation de Mongo db<br />Exemples de code simples<br />Evolutions<br />
  4. 4. Le site en quelques slides<br />Citizart.com<br />Mise en relation de créateurs d’objets de mode et de déco avec des acheteurs et avec des professionnels de l’évènementiel<br />Enjeux<br />Exposer et permettre d’acheter des objets uniques et de qualité<br />Faire connaître les créateurs et leurs talents<br />Etre agile dans les développements<br />
  5. 5. Home page – ajaxsearchengine<br />
  6. 6. RefineFacets and Searchresults<br />
  7. 7. Detailed data sheet<br />
  8. 8. General informations – form<br />
  9. 9. Photos Gallery – form<br />
  10. 10. Les besoins fonctionnels<br />Entités complexes : <br />product, event, customer, email, showroom, photos gallery, …<br />Beaucoup de formulaires de saisie <br />Chaque créateur possède son espace de saisie (11 formulaires)<br />Recherches<br />Attributes, full text, refine by (facet)<br />Site en évolution constante<br />Besoin de souplesse dans l’ajout/modification des données et de leur structure<br />Back office<br />Gestion de listes d’autorités arborescentes<br />Publication des produits<br />Saisie de contenus (CMS)<br />
  11. 11. Les réponses techniques<br />Choix des technos<br />ASP.NET / C#<br />IIS<br />SQL Server puis Mongo DB<br />Objets fortement typés <br />Permet la complétion de code dans Visual Studio<br />Développement plus rapide quand on y est habitué<br />Linq<br />Permet l’écriture de requêtes complexes en C# sans avoir besoin de regarder la syntaxe json / javascript de mongo (ou SQL)<br />Pas de maintenance de code dans la base (pb de versionning)<br />Fonctions de MapReduce de Mongo<br />Permet le faceting (grouping)<br />
  12. 12. Agenda<br />Contexte du site CitizArt<br />Utilisation de Mongo db<br />Exemples de code simples<br />Evolutions<br />
  13. 13. Historique<br />Site initialement créé sur une racine NopCommerce<br />ASP.NET / C#<br />SQL Server<br />Entity Framework<br />Pourquoi me suis-je tourné vers Mongo db ?<br />Lenteurs de Entityfrmwk avec de petits volumes de données<br />Un jour un Save() n’a pas enregistré données sans rien dire<br />Caractéristiques importantes de Mongo<br />Rapidité à l’insertion et à la recherche<br />Montée en charge assurée nativement<br />Pas de setup avec un JRE ou gros installer, juste un « exe »<br />Monitoring/Metrics du serveur<br />MapReducecapapilities (Group by)<br />
  14. 14. Faire le choix de Mongo<br />Après plusieurs mois à surveiller la tendance noSQL<br />Après avoir regardé Cassandra, Reddis, CouchDB<br />Vu les grands noms qui utilisaient Mongo DB : Shutterfly, Foursquare, bit.ly, Source Forge, Etsy, …<br />Mongo semblait bien pour du logging ou de l’insertion de masse, je voulais savoir si l’on pouvait également l’utiliser pour une application plus « classique »<br />La meilleure façon de faire était de se jeter à l’eau <br />
  15. 15. Le driver NoRM<br />Avantages<br />Open source écrit en C#<br />Gère la persistance des objets avec Mongo<br />Requêtes en Linq<br />Commandes d’admin : indexs, drop, …<br />Support de Mono (pour évolutions futures)<br />Mais<br />Communauté limitée<br />Peu de commits depuis juillet 2010 (adopté en octobre 2010)<br />https://github.com/atheken/NoRM/wiki/<br />
  16. 16. Modèle et données<br />Avant (en SQL server)<br />Création de l’entité et des champs dans la base de données<br />Ajout de la classe dans les objets métiers<br />Ajout de l’entité « Collection » dans le Context<br />Mapping dans le fichier « graphique » model.edmx<br />Design des formulaires de saisie<br />Maintenant (Mongo)<br />Ajout de la classe dans les objets métiers<br />Design des formulaires de saisie<br />Conclusion<br />Concentré sur le métier moins sur le paramétrage et le code de plomberie avec la base de données<br />
  17. 17. Comparaison rapide SQL / noSQL<br />
  18. 18. Agenda<br />Contexte du site CitizArt<br />Utilisation de Mongo db<br />Exemples de code simples<br />Evolutions<br />
  19. 19. Server 1<br />Architecture très classique<br />IIS 7<br />ASP.NET 4.0<br />NoRM C# Driver<br />HTTP<br />Mongo DB<br />1.6.5 / 64b<br />
  20. 20. Un peu de code ?<br />
  21. 21. Conception rapide - Exemple<br />Un client avec 0 ou n adresses de facturation<br />Customer<br />Id, First name, Last name<br />Date of birth<br />Billingaddresses (collection de Address)<br />Address<br />Street, <br />Zipcode, City<br />Country<br />
  22. 22. Cas d’utilisations typiques<br />
  23. 23. Documents imbriqués<br />
  24. 24. C’est vraiment enregistré ?<br />On lance la console mongo.exe<br />> show dbs<br />NoRMSample1<br />Admin<br />> use NoRMSample1<br />switched to db NoRMSample1<br />> show collections<br />Customer<br />NormHiLoKey<br />system.indexes<br />><br />
  25. 25. C’est vraiment enregistré ?<br />On vérifie<br />> db.Customer.find()<br />{ "_id" : 1, "FirstName" : "Andrew", <br />"LastName" : "SMITH", <br />"BirthDate" : "Sun Oct 05 1980 00:00:00 GMT+0200", "BillingAddresses" : [<br /> {<br /> "Street" : "151 rue Montmartre",<br /> "ZipCode" : "75002",<br /> "City" : "Paris",<br /> "Country" : "FR"<br /> }<br />] }<br />><br />
  26. 26. Plutôt graphique ? : Mongo VUE<br />
  27. 27. OK. On peut relire maintenant ?<br />Un peu de Linq<br />
  28. 28. On peut chercher sur les objets imbriqués ?<br />Un peu de Linq et expression Lambda pour le fun<br />
  29. 29. La partie déclarative du code C#<br />C’est un language statique, donc on doit définir les objets que l’on manipule :<br />Connexion<br />Couches objets<br />La classe d’aide que j’ai définie (PersistantObject)<br />
  30. 30. Connexion à Mongo<br />Utilisation d’une chaine de connexion<br />
  31. 31. Objets en C# - Pas de magie, faisons simple<br />
  32. 32. PersistantObject<br />
  33. 33. Et c’est rapide ?<br />A l’insertion<br />Source : Michael Kennedy, http://www.michaelckennedy.net/blog/CommentView,guid,c5043397-ad33-4141-9bb7-64707a9c987d.aspx<br />
  34. 34. Et c’est rapide ?<br />A la recherche<br />Source : Michael Kennedy, http://www.michaelckennedy.net/blog/CommentView,guid,c5043397-ad33-4141-9bb7-64707a9c987d.aspx<br />Recherche par Id<br />Recherche complexe avec relation<br />Customer > Order<br />
  35. 35. Batch Update field value<br />MONGO javascript<br />SQL<br />db.Customer.find("this.GeoCountyId === 7169") .forEach(function (customer) {<br />customer.GeoCountyId = 7355;<br />db.Customer.save(customer);<br /> }<br />)<br />update Customer setGeoCountryId = 7355<br />whereGeoCountryId = 7169<br />
  36. 36. Agenda<br />Contexte du site CitizArt<br />Utilisation de Mongo db<br />Exemples de code simples<br />Evolutions<br />
  37. 37. Les problèmes rencontrés<br />Courbe d’apprentissage de Mongo DB<br />Se défaire de ses habitudes des RDBMS<br />Il me reste beaucoup de choses à apprendre<br />Id non linéaires de NoRM (HiLoalgo)<br />Obligé de développer un algo pour rendre les Id continus<br />Bug dans NoRM<br />Quand un champ existant dans Mongo et non en C#<br />Correction faite dans le code<br />NoRM Problème de stabilité / memoryleak<br />Corrigé en fermant proprement les connexions après chaque utilisation<br />
  38. 38. Prochaines Evolutions<br />Passer sur Mongo 1.8<br />GeoQueries<br />Data durability<br />Montée en charge <br />Poser des index<br />Passer les images sur GridFS<br />Envisager d’utiliser le Sharding<br />Cloud pour l’applicatif<br />Si NoRM non maintenu sur la durée et bugs bloquants<br />regarder du côté de Mongo C# driverFluent Mongo pour Linq<br />
  39. 39. Pour en savoir plus<br />Contactez <br />Erwan de Cadoudal, edecadoudal@eca-solutions.fr<br />www.citizart.com<br />Resources<br />http://www.mongodb.org/<br />https://github.com/atheken/NoRM<br />http://normproject.org/<br />Merci<br />

×