Condividi tramite


Il presente articolo è stato tradotto automaticamente.

Il programmatore al lavoro

Scelta "NoSQL" con MongoDB

Ted Neward

Scaricare il codice di esempio

Negli ultimi dieci anni o più, dall'annuncio del Microsoft .NET Framework nel 2000 e dal primo rilascio nel 2002, gli sviluppatori .NET hanno avuto difficoltà a mantenesi aggiornati su tutte le nuove informazioni proposte da Microsoft.E come se che non era sufficiente “ comunità ”, che significa che entrambi gli sviluppatori che utilizzano .NET su base giornaliera e quelli che Don ’t, ha superato e creato alcune cose per riempire aree libere Microsoft non copre più, oppure semplicemente per creare chaos e confusione (selezionati).

Uno di quegli elementi “ nuovi ” per emergono dalla comunità all'esterno di Microsoft aegis è lo spostamento NoSQL, un gruppo di sviluppatori che apertamente sfida l'idea che tutti i dati è/verrà/devono essere memorizzati in un sistema di database relazionali di alcuni form. Le tabelle, righe, colonne, chiavi primarie, i vincoli di chiave esterna e argomenti su valori null e indica se una chiave primaria deve essere un naturale o innaturale … è nulla sacred?

In questo articolo e suoi successori presi in esame uno dei principali strumenti advocated da quelli in movimento NoSQL: MongoDB cui nome deriva dalla “ hu MONGO us, ” in base al sito MongoDB Web (e no, mi non che che compongono). Tutti gli elementi e MongoDB verrà considerato per la maggior parte: l'installazione, esplorare e utilizzo di .NET Framework, incluso il supporto LINQ offerto; utilizzo da altri ambienti (applicazioni desktop e applicazioni Web e servizi); e su come configurarlo in modo che gli amministratori di Windows il produzione non masterizzare in effigy.

Problema (o, perché servizio, Ripeti?)

Prima di ottenere troppo profonda i dettagli di MongoDB, è opportuno chiedere perché tutti gli sviluppatori di .NET Framework dovrebbero sacrificare successiva mezz'ora o operazione loro Vite leggere questo articolo e seguendo nei loro computer portatili. Dopo tutto, SQL Server è disponibile in un'edizione Express gratuita e ridistribuibile, che fornisce un'opzione di archiviazione dati leggera da database relazionali tradizionali enterprise o datacenter associazione e vi sono certamente una notevole quantità di strumenti e librerie disponibili per fornire più facile accesso, inclusi di Microsoft LINQ ed Entity Framework.

Il problema è che il livello di potenza del modello relazionale, ovvero relazionale del modello stesso, è anche la maggiore debolezza. La maggior parte degli sviluppatori se. NET, Java o un altro elemento completamente, può, ovvero dopo solo ’ pochi anni di esperienza, descrivere in dettaglio più complesso come tutto ciò che non rientra perfettamente in un modello “ quadrato ” tabelle, righe o colonne. Tentativo di modello dati gerarchico possibile unità anche più esperto sviluppatore completamente bonkers così tanto Celko che Giovanni ha scritto un libro, ovvero “ SQL per Smarties Third Edition ” (Morgan-Kaufmann, 2005), ovvero interamente sul concetto di modellazione dei dati gerarchici in un modello relazionale. E se si aggiunge a questo problema di base “ determinato ” relazionale che i database si presuppongono una struttura flessibile per i dati, ovvero lo schema del database, ovvero si tenta di supportare ad hoc “ additionals ” ai dati diventa difficile. (Mani di presentazione rapida,: Quanti di voi circolazione funziona con i database che dispone di una colonna di note o addirittura migliore, Note1, Note2, Note3 …?)

Nessun utente all'interno del movimento NoSQL consentirà di suggerire che il modello relazionale non dispone di suoi punti di forza o che il database relazionale verrà chiusa, ma un fatto della vita di sviluppatore nei negli ultimi due decenni base è che gli sviluppatori spesso sono memorizzati dati in database relazionali che non è intrinsecamente (o talvolta anche in remoto) relazionale natura.

Il database orientati ai documenti vengono archiviati “ documenti ” (knit strettamente raccolte di dati che in genere non sono connessi ad altri elementi di dati nel sistema) anziché “ relazioni ” Ad esempio, interventi nel blog in un sistema di blog sono completamente non connessi a un altro e anche quando uno fa riferimento a un altro, nella maggior parte dei casi la connessione viene effettuata attraverso un collegamento ipertestuale che si intende annullare i essere riferimenti dal browser dell'utente non internamente. Commenti su tale voce di blog interamente sono limitati a tale voce di blog e raramente si utenti mai desiderano visualizzare l'aggregazione di tutti i commenti, indipendentemente che commentare la voce.

Inoltre, i database orientati ai documenti tendono a excel in ambienti a elevate prestazioni o competitive; MongoDB è particolarmente rivolto ad alte prestazioni, mentre una chiusura cugino di esso, CouchDB, mira più in scenari competitive. Sia evitare qualsiasi tipo di supporto delle transazioni multi-object, che significa che, sebbene supportano modifica simultanea di un singolo oggetto in un database, qualsiasi tentativo di modificare più di uno alla volta lascia una piccola finestra di tempo in cui tali modifiche possono essere visualizzate “ nel passaggio. ” I documenti vengono aggiornati in modo atomico ma non esiste il concetto di una transazione che coinvolge gli aggiornamenti di documenti multipli. Ciò non significa che MongoDB non dispone di qualsiasi durata, ovvero significa semplicemente che l'istanza MongoDB non è intenzione di sopravvivere un'interruzione dell'alimentazione e di istanza è un'istanza di SQL Server. I sistemi che richiedono completa atomicità, consistenza, isolamento e durevolezza (ACID) semantica è meglio disattivare con i sistemi di database relazionali tradizionali, in modo da dati critici molto probabilmente non essere visualizzati all'interno di un'istanza MongoDB presto, ogni volta salvo ad esempio i dati replicati o memorizzate nella cache che risiedono su un server Web.

In generale, MongoDB funziona anche per applicazioni e componenti necessari per memorizzare i dati che è possibile accedere rapidamente e viene utilizzati spesso. Analisi del sito Web, le preferenze dell'utente e impostazioni e qualsiasi tipo di sistema in cui i dati non sono completamente strutturati o devono essere strutturalmente flessibile, ovvero sono candidati per MongoDB naturali. Ciò non significa che MongoDB completamente non è pronto per essere un archivio dati primario per i dati operativi; significa semplicemente che MongoDB funziona bene in aree non RDBMS tradizionali, come un numero di aree che possono essere gestite da uno.

in Windows 7

Come accennato in precedenza, MongoDB è un pacchetto software open source facilmente scaricato dal sito MongoDB Web di mongodb.com. Aprire il Web sito in un browser dovrebbe essere sufficiente per i collegamenti per il raggruppamento binario scaricabile di Windows, esaminare il lato destro della pagina per il collegamento di download. In alternativa, se si preferiscono collegamenti diretti, utilizzare mongodb.org/Display/DOCS/Downloads. Redazione, la versione stabile è 1.2.4 il rilascio. È semplicemente un raggruppamento di file con estensione zip, pertanto l'installazione è inutile semplice e relativamente relatore: decomprimere solo il contenuto in qualsiasi punto desiderato.

Seriamente. Niente altro.

Il file ZIP viene esplosa in tre directory: bin, include e lib. La directory sola di interesse è collocazione contenente otto file eseguibili. Nessun altre dipendenze di file binario (o runtime) sono necessarie e, infatti, solo due di tali file eseguibili sono di interesse in questo momento. Questi sono mongod.exe, MongoDB database stesso processo e mongo.exe client shell della riga di comando, che viene in genere utilizzato nello stesso modo il client di shell della riga di comando di SQL Server isql.exe precedente, ovvero per assicurarsi che siano installati correttamente e lavoro; visualizzare i dati direttamente; ed eseguire attività amministrative.

Verifica che tutti gli elementi installati correttamente è semplice come la generazione di mongod da un client della riga di comando. Per impostazione predefinita, MongoDB desideri memorizzare i dati nel percorso del file System predefinito, c:\data\db, ma questo è configurabile con un file di testo passato in base al nome della riga di comando tramite--config. Supponendo che esista una sottodirectory denominata db ovunque mongod verrà avviato, verificare che tutto sia kosher è semplice come vedere in Nella figura 1.

image: Firing up Mongod.exe to Verify Successful Installation

Figura 1 Generazione di Mongod.exe verifica installazione completata

Se la directory non esiste, MongoDB non lo crea. Si noti che nella finestra di Windows 7 quando viene avviata MongoDB, nella finestra di dialogo consueto “ l'applicazione desideri aprire una porta ” popup. Assicurarsi che la porta (27017 per impostazione predefinita) è accessibile o la connessione sarà … difficile al meglio. (Ulteriori informazioni su questo in un articolo successivo, quando verranno illustrati l'inserimento in un ambiente di produzione MongoDB.)

Una volta che il server è in esecuzione, la connessione con la shell è semplicemente come semplice, ovvero un ambiente della riga di comando che consente l'interazione diretta con il server viene avviata l'applicazione mongo.exe come illustrato in Nella figura 2.

image: Mongo.exe Launches a Command-Line Environment that Allows Direct Interaction with the Server

Nella figura 2 Mongo.exe lancia un ambiente della riga di comando che consente l'interazione diretta con il server

Per impostazione predefinita, la shell si connette al database “ test ”. Poiché l'obiettivo qui è solo per verificare che tutto funzioni, test è corretto. Ovviamente, da qui è abbastanza semplice creare alcuni dati di esempio per lavorare con MongoDB, ad esempio un oggetto rapido che descrive una persona. È una rapida panoramica in modalità MongoDB visualizzazioni dati per eseguire l'avvio, come abbiamo vedere Nella figura 3.

image: Creating Sample Data

Nella figura 3 Creazione di dati di esempio

In sostanza, MongoDB utilizza la notazione dei dati che descrive la flessibilità e il modo in cui i client interagisce con esso JSON (JavaScript Object Notation). MongoDB memorizza internamente, operazioni in BSON un superset di JSON, binario per l'archiviazione e l'indicizzazione più semplice. Tuttavia, JSON rimane formato di input/output preferito del MongoDB e in genere è il formato documentato utilizzato attraverso il sito MongoDB Web e wiki. Se non si ha familiarità con JSON, è buona norma prima di ottenere in modo intensivo in MongoDB Aggiornatevi su di esso. Nel frattempo, solo per grins, peer nella directory in cui mongod è memorizzazione dei dati e si noterà che un paio di “ test ” - denominata sono visualizzati i file.

Sufficiente riproduzione — tempo alla scrittura del codice. Chiudere la shell è sufficiente digitare “ exit ” e arrestare il server richiede solo un CTRL+C nella finestra oppure chiuderla; il server acquisisce il segnale di chiusura e chiude tutti i dati correttamente prima di terminare il processo.

Server del MongoDB (e della shell, anche se non più di un problema) viene scritto come un'applicazione c ++ nativa, ovvero ricordare quelli?, pertanto l'accesso richiede qualche tipo di driver di .NET Framework è in grado di connettersi tramite socket aperto per l'alimentazione, comandi e i dati. La distribuzione MongoDB non dispone di un driver di .NET Framework fornito con esso, ma Fortunatamente la comunità ha fornito uno, in cui “ comunità ” in questo caso è uno sviluppatore in base al nome della Corder SAM che ha creato un driver di .NET Framework e LINQ il supporto per l'accesso a MongoDB. Il suo lavoro è disponibile nella finestra di origine e formato binario da github.com/samus/mongodb-CSharp. Scaricare i file binari presenti nella pagina (aspetto nell'angolo superiore destro) o le origini e generarlo. In entrambi i casi, il risultato è due assembly: MongoDB.Driver.dll e MongoDB.Linq.dll. Una rapida Aggiungi riferimento per il nodo Riferimenti del progetto e di .NET Framework è ora possibile rock.

Scrittura di codice

Fondamentalmente, apertura di una connessione a un server in esecuzione MongoDB non è molto diverso dall'apertura di una connessione a qualsiasi altro database, come illustrato in Nella figura 4.

Nella figura 4 Apertura di una connessione a un Server MongoDB

using System;
using MongoDB.Driver; 

namespace ConsoleApplication1
{
  class Program
  {
    static void Main(string[] args)
    {
      Mongo db = new Mongo();
      db.Connect(); //Connect to localhost on the default port
      db.Disconnect();
    }
  }
}

Non rilevando l'oggetto creato in precedenza è difficile, semplicemente … altro … da ciò che gli sviluppatori di .NET Framework utilizzato in precedenza (vedere Nella figura 5).

Nella figura 5 Individuazione di un oggetto creato Mongo

using System;
using MongoDB.Driver; 

namespace ConsoleApplication1
{
  class Program
  {
    static void Main(string[] args)
    {
      Mongo db = new Mongo();
      db.Connect(); //Connect to localhost on the default port.
      Database test = db.getDB("test");
      IMongoCollection things = test.GetCollection("things");
      Document queryDoc = new Document();
      queryDoc.Append("lastname", "Neward");
      Document resultDoc = things.FindOne(queryDoc);
      Console.WriteLine(resultDoc);
      db.Disconnect();
    }
  }
}

Se questo ha un aspetto un po' complesso, rilassati, viene scritto “ modo lungo ” perché MongoDB memorizza le cose in modo diverso rispetto ai database tradizionali.

Per i principianti, ricordare che i dati inseriti in precedenza aveva tre campi, ovvero firstname, lastname e validità e una di queste sono elementi che possono essere recuperati i dati. Ma soprattutto, la riga che li tossed piuttosto cavalierly memorizzati era “ test.things.save () ”, che implica che i dati vengono archiviati in un elemento denominato “ cose ” Nella terminologia MongoDB “ cose ” sono un insieme e in modo implicito di tutti i dati vengono memorizzati in un insieme. Gli insiemi a sua volta contengono documenti che contengono le coppie chiave/valore in cui i valori possono essere raccolte aggiuntive. In questo caso, “ cose ” sono un insieme memorizzato all'interno di un database, come indicato in precedenza è il database di test.

Di conseguenza, recupero dei dati implica innanzitutto la connessione al server MongoDB, quindi nel database di prova, quindi trovare l'insieme “ cose ” Questo è che le prime quattro righe in Nella figura 5 scopo, creare un oggetto Mongo che rappresenta la connessione, si connette al server, si connette al database di prova e quindi Ottiene l'insieme “ cose ”.

Una volta restituito l'insieme, il codice può eseguire una query per trovare un singolo documento tramite la chiamata FindOne. Ma come con tutti i database, il client non desidera recuperare tutti i documenti nell'insieme e trovare quello che è interessato a, ovvero in qualche modo, la query deve essere vincolato. In MongoDB, questa operazione viene eseguita mediante la creazione di un documento che contiene i campi e i dati per la ricerca in tali campi, un concetto noto come query di esempio o QBE abbreviato. Poiché l'obiettivo è quello di trovare il documento contenente un campo Cognome cui valore è impostato su “ Neward ”, un documento contenente il cognome di un campo e il relativo valore viene creato e passato come parametro per FindOne. Se la query ha esito positivo, restituisce un altro documento contenente tutti i dati in questione (più un campo più); in caso contrario restituisce null.

L'altro, la versione breve della descrizione di questo può essere conciso come come:

Document anotherResult = 
         db["test"]["things"].FindOne(
           new Document().Append("lastname", "Neward"));
       Console.WriteLine(anotherResult);

Quando eseguito, non solo vengono inviati i valori originali visualizzati ma uno nuovo, verrà visualizzato un campo _id contenente un oggetto IDOggetto. Questo è l'identificatore univoco per l'oggetto e in modo invisibile all'utente è stato inserito dal database quando è stati memorizzati i nuovi dati. Qualsiasi tentativo di modificare l'oggetto deve conservare tale campo o il database presupporrà che si tratta di un nuovo oggetto inviato nella. In genere, questa operazione viene eseguita modificando il documento è stato restituito dalla query:

anotherResult["age"] = 39;
       things.Update(resultDoc);
       Console.WriteLine(
         db["test"]["things"].FindOne(
           new Document().Append("lastname", "Neward")));

Tuttavia, è sempre possibile creare una nuova istanza di documento e la compilazione manualmente nel campo _id corrispondenza IDOggetto, se opportuno ulteriori:

Document ted = new Document();
       ted["_id"] = new MongoDB.Driver.Oid("4b61494aff75000000002e77");
       ted["firstname"] = "Ted";
       ted["lastname"] = "Neward";
       ted["age"] = 40;
       things.Update(ted);
       Console.WriteLine(
         db["test"]["things"].FindOne(
           new Document().Append("lastname", "Neward")));

Naturalmente, se è già nota la _id, utilizzabili come criteri di query.

Si noti che il documento è in realtà non tipizzato, ovvero quasi tutto ciò è possibile memorizzare in un campo da qualsiasi nome, inclusi alcuni tipi di valore .NET Framework di base, ad esempio DateTime. Tecnicamente, come indicato, MongoDB memorizza dati BSON, che include alcune estensioni ai tipi di JSON tradizionali (string, integer, Boolean, double e null, anche se i valori Null sono consentiti solo su oggetti, non negli insiemi), ad esempio l'IDOggetto citati in precedenza, i dati binari, le espressioni regolari e codice JavaScript incorporato. Per il momento abbiamo lasciare il secondo due da solo, ovvero il fatto che BSON possibile memorizzare dati binari significa che tutto ciò che può essere ridotto a una matrice di byte possono essere memorizzati, che comporta MongoDB possibile memorizzare qualsiasi elemento, anche se potrebbe non essere in grado di eseguire query in tale blob binario.

Non inattivi (o Chiudi) ancora!

Non vi è molto più per discutere sui MongoDB, incluso il supporto per LINQ, eseguendo query più complesse sul lato server che superano le semplici funzionalità di query stile QBE illustrate finora; e recupero MongoDB TTL Fortunatamente in una server farm di produzione. Ma per ora, in questo articolo e un'attenta analisi di IntelliSense dovrebbe essere sufficiente per ottenere il programmatore di lavoro avviato.

Se è presente un particolare argomento che si desidera vedere esplorate, comunque, non esitare a me eliminare una nota. In modalità reale, è Dopotutto della colonna. Buona codifica!

Ted Neward è un oggetto principal con Neward & Associates, un'impresa indipendenti ed è specializzato in sistemi aziendali .NET Framework e Java piattaforma. Ha scritto oltre 100 articoli, è un MVP C#, relatore di INETA e ha creato e coautore di circa una dozzina libri, tra cui la prossima “ Professional F # 2.0 ” (Wrox). Egli consulta e mentors regolarmente, ovvero contattarlo al ted@tedneward.com o leggere il suo blog all'indirizzo blogs.tedneward.com.

Grazie ai seguenti esperti tecnici per la revisione di questo articolo: Kyle Banker e Sam Corder