MongoDB avec C#

A-propos de l’article

On constate un intérêt grandissant pour l’utilisation de couches de données noSQL. L’article ici présente l’utilisation d’un des systèmes les plus connus du marché MongoDB et notamment la version 3.

Présentation de MongoDB

Qu’est-ce que MongoDB?

MongoDB est une base de données orientée document sponsorisée par 10gen. Elle est utilisée notamment chez Foursquare, SourceForge et Bit.ly.
Mongo stocke les documents au format BSON (JSON binaire supportant un peu plus de types de valeur) et fournit un shell javascript pour accéder aux données et faire les opérations d’administration. De nombreux drivers sont implémentés notamment pour Java, .Net, PHP, Javascript
La notion de base orientée document signifie que les objets stockés sont représentés sous la forme d’un document BSON (pas seulement une map de style clef/valeur) permettant facilement de se mapper sur les objets que l’on manipule dans nos programmes. On pourrait le comparer à un stockage d’une représentation XML d’une grappe d’objets.

Schemaless : Comparaison entre NoSQL MongoDb et les bases relationnelles classiques

Lorsqu’on développe une couche d’accès aux données, nous allons souvent devoir soit utiliser un ORM, soit utiliser un mapper qu’on aura développé nous-même, mais les deux feront le même travail à savoir la transformation et le mapping d’objet en relation.
De plus comme les bases de données classiques relationnelle ne permettent pas le stockage des données complexes (entité avec des tableaux, imbrication, collection), nous devons effectuer différentes requêtes SQL pour obtenir nos données ou les mettre à jour.
En vue de ces 2 points, le développement d’une couche d’accès aux données beaucoup de travail. Ces jours que nous perdons à implémenter une réponse technique et non fonctionnelle, nous pourrions les affecter au développement métier et ainsi satisfaire d’avantage notre client. 
Pour cela une seule solution, stocker les objets .NET telle qu’ils sont et demander à notre moteur de persistance de gérer pour nous ce travail.
Un rêve que MongoDB et les bases de données NoSQL permettent de tenir. C’est ce qu’on appelle le schemaless.

Qu’apporte Le sharding avec MongoDB ?

MongoDB depuis sa version 1.2 intègre une gestion de sharding. L’application de cette gestion permet d’avoir une scalabilité plus importante. Nos données sont toutes cohérentes, car on accède toujours à tout. Le concept du sharding n’est pas d’avoir plusieurs bases de données en master/master, mais une seule base de donnée qui répartie ses propres données dans les différentes instances. On se retrouve ainsi à posséder certaines données sur une instance et les autres sur une autre. Cet aspect n’est pas détaillé dans cet article.

Qu’apporte le GridFS ?

MongoDB embarque avec lui un système de fichiers complet. Ce système est GridFS. MongoDB est limité par document à 4Mo, mais on a vite besoin de stocker des documents plus importants. GridFS permet ça. On stocke donc tout document supérieur à 4 Mo sur le système de fichier GridFS. GridFS permet ainsi d’avoir le sharding sur ses fichiers. On a donc besoin de rsync entre plusieurs machines. GridFS fait le boulot pour soi. On pourrait facilement rapprocher GridFS à Hbase.

Un système de requêtes évolué

Enfin le vrai intérêt de MongoDB selon moi, surtout par rapport à Riak ou CouchDB, c’est sa gestion de requêtage. On peut requêter de façon très fine grâce à une grande quantité de mots-clé. On peut donc faire des requêtes aussi riches qu’en SQL, mais tout ça sur une base de données orientée Documents.
On peut par exemple chercher tous les documents qui possèdent plusieurs éléments dans un tableau
db.things.find( { a: { $all: [ 2, 3 ] } } );
Alors qu’en SQL on aurait plus fait un
select * from things where a LIKE ‘%2%’ AND a LIKE ‘%3%’ 
Mais cette dernière est finalement incomplète car ça marchera pour un champ « A » contenant un array [32] en SQL mais ne fonctionnera pas dans le cas de la requête MongoDB.
On peut aussi faire de la recherche en donnant une fonction Javascript
db.myCollection.find( { $where: « this.a > 3 » } );
C’est très modulaire et le nombre de mot clé ne cesse d’augmenter.

Prise en main sous .NET 4.5

Il existe de nombreux utilitaire, librairie pour communiquer avec MongodB, je vous conseille de rester au standard et d’utiliser le driver fournit par le projet MongoDB même.

Nous utiliserons le mécanisme classique des autres DAL. A savoir 
La connectionstring dans le web.config pour définir le serveur

Installation de MongoDB sur votre machine (instance unique)

  1. Avant de pouvoir commencer l’installation, il faut télécharger la dernière version de MongoDB. Pour ce faire, aller à l’adresse suivante : http://www.mongodb.org/downloads et choisissez le type d’installation que vous désirez.
  2. Pour lancer l’installation, il vous suffit de double-cliquer sur le paquet msi et de suivre les instructions affichées à l’écran
  3. Créez le dossier qui contiendra vos bases de données c:\data\db et un dossier log c:\data\log
  4. Créez un fichier de paramétrage vous permettant de configurer mongodb : mongod.conf
  5. Vous pouvez démarrer mongod en utilisant le programme mongod.exe se trouvant dans le dossier bin : mongod –config mongod.conf
  6. Vous pouvez également configurer mongod pour l’utiliser comme un service : mongod –config mongod.conf –install
  7. Configurez le mode de démarrage de mongod en automatique ou en manuelle : sc config mongod start=auto

Hébergement d’une base MongoDB avec réplication sur Windows Azure

Windows Azure ne supporte plus nativement MongoDb, vous disposez des services SAAS exemple mongolab, mais cela est payant, pour vous permettre de prendre en charge un cluster MongoDB gratuitement, vous devez créer 2 VM de base

    1. Créez une VM nommez la <votresociete>mgdb1
    2. Créez une autre VM nommez la <votresociete>mgdb2
    3. Associez un disque à chacune de vos VM de 30 Gb et associez la lettre f:

Répetez l’opération suivante sur chaque VM

      1. Connectez-vous sur votre première machine
      2. Formatez votre disque data
      3. Désactivez le contrôle IE.
      4. Ajoutez le site http://*.mongodb.org à la liste des sites de confiance
      5. Téléchargez la version 64bits
      6. Installez le msi
      7. MongoDb par défaut est installé dans le dossier C:\Program Files\MongoDB\Server\3.2\bin, créez une variable d’environnement Path pointant vers ce dossier
      8. Téléchargez OpenSSL et installez le, cela vous permettra de créer un certificat pour votre replication : https://slproweb.com/download/Win64OpenSSL_Light-1_0_2f.exe
      9. Créez 2 dossiers sur votre lecteur f : data et log
      10. Créez 1 dossier conf
      11. Ajoutez un fichier mongod.conf
      12. Ajoutez les paramètres nécessaires :
        • Port : numéro du port sur le quel écouté par défaut 27017
        • Dbpath : chemin d’accès aux données
        • replSet=rs0 : indique qu’on va utiliser une réplication
        • logpath : indique le chemin d’accès au fichier de log
        • logaappend indique la rotation
      13. si le nœud n’est pas le premier, créez le dossier keys et copiez le fichier mongodb-keyfiles du premier nœud.
      14. Installez mongodb en service mongod –config f:\conf\mongod.conf –install
      15. Démarrez le service mongdb net start mongodb
      16. Si c’est le premier nœud, Connectez-vous au serveur mongo et démarrez la réplication rs.initiate()
      17. Ouvrez un port au niveau du firewall pour pouvoir vous connecter au service MongoDB
      18. Configurez un endpoint au niveau de Windows azure pour la machine virtuelle sur le port TCP 27017
      19. Si c’est le premier nœud, Créez les utilisateurs administratifs sur le master
      20. Arrêtez l’instance de mongodb
      21. Créez sur le premier nœud uniquement un fichier clé pour être utilisé par chaque membre d’une réplication
        • Je vous conseille d’utiliser openssl mais vous pouvez utiliser d’autre mécanisme.
        • Copiez le fichier key généré sur chaque membre
        • Modifiez le fichier de configuration pour spécifier le fichier de clé à utiliser. keyFile
        • Refaire l’opération sur le premier serveur

Ajoutez un nœud à une réplication

      1. Depuis la machine host du nouveau nœud,
      2. Connectez-vous au nœud premier mongo -u siteRootAdmin –p –authenticationDatabase admin
      3. Utilisez la méthode rs.add(« nomdelamachine :27017 ») pour ajouter le nœud

Vérifiez la configuration d’une réplication.

      1. Depuis n’importe quel host
      2. Connectez-vous au premier nœud mongo -u siteRootAdmin –p –authenticationDatabase admin
      3. Utilisez la méthode rs.conf()

Développement de la couche d’accès aux données sous Visual Studio 2015

    1. Reprenez les librairies créées précédemment dans nos article 1 et 2,
    2. Dans le projet STPVideoPlayer.DataLayer, ajoutez les classes suivantes
      • EpisodeModel: pour décrire un épisode
      • LocalVideoModel : Pour décrire un fichier vidéo local
      • YoutubeModel : Pour décrire une vidéo ou une playlist hébergée sur youtube
      • TimeLineModel : Pour décrire une planification
    3. Installez le driver MongoDB depuis nuget au projet STPVideoPlayer.Data.MongoProvider
    4. Créez une classe TvPlayerRepository
    5. Implémentez le code nécessaire à notre fournisseur en implémentant l’interface ITvPlayerRepository

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.