Mongo db with C#

Preview:

DESCRIPTION

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

Citation preview

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

Recommended