mongo db with c#
Post on 16-May-2015
4.615 Views
Preview:
DESCRIPTION
TRANSCRIPT
Mongo db / C# / Linq cas du site www.citizart.com
Erwan de Cadoudal le 23 mars 2011
Agenda
Contexte du site CitizArt
Utilisation de Mongo db
Exemples de code simples
Evolutions
Agenda
Contexte du site CitizArt
Utilisation de Mongo db
Exemples de code simples
Evolutions
Le site en quelques slides Citizart.com
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
Enjeux Exposer et permettre d’acheter des objets uniques
et de qualité Faire connaître les créateurs et leurs talents
Etre agile dans les développements
Home page – ajax search engine
Refine Facets and Search results
Detailed data sheet
General informations – form
Photos Gallery – form
Les besoins fonctionnels Entités complexes :
product, event, customer, email, showroom, photos gallery, … Beaucoup de formulaires de saisie
Chaque créateur possède son espace de saisie (11 formulaires) Recherches
Attributes, full text, refine by (facet) Site en évolution constante
Besoin de souplesse dans l’ajout/modification des données et de leur structure
Back office Gestion de listes d’autorités arborescentes Publication des produits Saisie de contenus (CMS)
Les réponses techniques Choix des technos
ASP.NET / C# IIS SQL Server puis Mongo DB
Objets fortement typés Permet la complétion de code dans Visual Studio Développement plus rapide quand on y est habitué
Linq Permet l’écriture de requêtes complexes en C# sans avoir
besoin de regarder la syntaxe json / javascript de mongo (ou SQL)
Pas de maintenance de code dans la base (pb de versionning) Fonctions de Map Reduce de Mongo
Permet le faceting (grouping)
Agenda
Contexte du site CitizArt
Utilisation de Mongo db
Exemples de code simples
Evolutions
Historique Site initialement créé sur une racine NopCommerce
ASP.NET / C# SQL Server Entity Framework
Pourquoi me suis-je tourné vers Mongo db ? Lenteurs de Entity frmwk avec de petits volumes de
données Un jour un Save() n’a pas enregistré données sans rien dire
Caractéristiques importantes de Mongo Rapidité à l’insertion et à la recherche Montée en charge assurée nativement Pas de setup avec un JRE ou gros installer, juste un « exe » Monitoring/Metrics du serveur Map Reduce capapilities (Group by)
Faire le choix de Mongo
Après plusieurs mois à surveiller la tendance noSQL
Après avoir regardé Cassandra, Reddis, CouchDB
Vu les grands noms qui utilisaient Mongo DB : Shutterfly, Foursquare, bit.ly, Source Forge, Etsy, …
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 »
La meilleure façon de faire était de se jeter à l’eau
Le driver NoRM Avantages
Open source écrit en C# Gère la persistance des objets avec Mongo Requêtes en Linq Commandes d’admin : indexs, drop, … Support de Mono (pour évolutions futures)
Mais Communauté limitée Peu de commits depuis juillet 2010 (adopté en octobre
2010)
https://github.com/atheken/NoRM/wiki/
Modèle et données Avant (en SQL server)
Création de l’entité et des champs dans la base de données Ajout de la classe dans les objets métiers Ajout de l’entité « Collection » dans le Context Mapping dans le fichier « graphique » model.edmx Design des formulaires de saisie
Maintenant (Mongo) Ajout de la classe dans les objets métiers Design des formulaires de saisie
Conclusion Concentré sur le métier moins sur le paramétrage et le code
de plomberie avec la base de données
Comparaison rapide SQL / noSQLFonction SQL Server Mongo DB
Licence Microsoft Open Source
Install Setup 2Go (<1h) Copie 20Mo (<1min)
Admin SQLCmd.exe Management Studio
Mongo.exeMongo VUE
Langage SQL (T-SQL) Javascript (json)
Modèle de données
Tables / Relations Collections / Documents
Transactions OUI NON
Procédures Stockées
T-SQL Javascript server
Emplacement Centralisé Réparti
Montée en charge Verticale Horizontale (Sharding)
Driver Sql Driver / C#Oledb
Official C# driver (+fluent Mongo pour Linq)NoRM C# driver …
Binary Blob FS Grid
Agenda
Contexte du site CitizArt
Utilisation de Mongo db
Exemples de code simples
Evolutions
Server 1
Architecture très classique
Mongo DB1.6.5 / 64b
IIS 7
ASP.NET 4.0
NoRM C# Driver
HTTP
Un peu de code ?
Conception rapide - Exemple Un client avec 0 ou n adresses de facturation
Customer Id, First name, Last name Date of birth Billing addresses (collection de Address)
Address Street, Zipcode, City Country
Cas d’utilisations typiques
Documents imbriqués
C’est vraiment enregistré ? On lance la console mongo.exe
> show dbsNoRMSample1Admin> use NoRMSample1switched to db NoRMSample1> show collectionsCustomerNormHiLoKeysystem.indexes>
C’est vraiment enregistré ? On vérifie> db.Customer.find(){ "_id" : 1, "FirstName" : "Andrew", "LastName" : "SMITH", "BirthDate" : "Sun Oct 05 1980 00:00:00 GMT+0200", "BillingAddresses" : [ { "Street" : "151 rue Montmartre", "ZipCode" : "75002", "City" : "Paris", "Country" : "FR" }] }>
Plutôt graphique ? : Mongo VUE
OK. On peut relire maintenant ? Un peu de Linq
On peut chercher sur les objets imbriqués ? Un peu de Linq et expression Lambda pour le
fun
La partie déclarative du code C#
C’est un language statique, donc on doit définir les objets que l’on manipule :
Connexion
Couches objets
La classe d’aide que j’ai définie (PersistantObject)
Connexion à Mongo Utilisation d’une chaine de connexion
Objets en C# - Pas de magie, faisons simple
PersistantObject
Et c’est rapide ? A l’insertion
Source : Michael Kennedy, http://www.michaelckennedy.net/blog/CommentView,guid,c5043397-ad33-4141-9bb7-64707a9c987d.aspx
Et c’est rapide ? A la recherche
Source : Michael Kennedy, http://www.michaelckennedy.net/blog/CommentView,guid,c5043397-ad33-4141-9bb7-64707a9c987d.aspx
Recherche par Id Recherche complexe avec relationCustomer > Order
Batch Update field value
db.Customer.find("this.GeoCountyId === 7169") .forEach(function (customer) { customer.GeoCountyId = 7355; db.Customer.save(customer); })
update Customer set GeoCountryId = 7355where GeoCountryId = 7169
MONGO javascriptSQL
Agenda
Contexte du site CitizArt
Utilisation de Mongo db
Exemples de code simples
Evolutions
Les problèmes rencontrés Courbe d’apprentissage de Mongo DB
Se défaire de ses habitudes des RDBMS Il me reste beaucoup de choses à apprendre
Id non linéaires de NoRM (HiLo algo) Obligé de développer un algo pour rendre les Id continus
Bug dans NoRM Quand un champ existant dans Mongo et non en C# Correction faite dans le code
NoRM Problème de stabilité / memory leak Corrigé en fermant proprement les connexions après chaque
utilisation
Prochaines Evolutions Passer sur Mongo 1.8
Geo Queries Data durability
Montée en charge Poser des index Passer les images sur GridFS Envisager d’utiliser le Sharding Cloud pour l’applicatif
Si NoRM non maintenu sur la durée et bugs bloquants regarder du côté de Mongo C# driver
Fluent Mongo pour Linq
Pour en savoir plus Contactez
Erwan de Cadoudal, edecadoudal@eca-solutions.fr www.citizart.com
Resources http://www.mongodb.org/ https://github.com/atheken/NoRM http://normproject.org/
Merci
top related