Este artigo foi traduzido por máquina.

O programador

Mudando para o NoSQL com o MongoDB

Ted Neward

Baixe o código de exemplo

Sobre a última década ou isso, desde o lançamento do Microsoft .NET Framework em 2000 e sua primeira versão em 2002, os desenvolvedores .NET possuem lutavam acompanhar todas as coisas novas que Microsoft lançou-los. E como se isso Don fosse suficiente, “ a comunidade ” — ou seja, ambos os desenvolvedores que usam o .NET em uma base diária e aqueles que Don — tiver desaparecido e criado algumas coisas mais para preencher orifícios Microsoft Don cobre — ou apenas para criar o caos e confusão (escolhido).

Uma dessas coisas “ novas ” a surgir da comunidade de fora do Microsoft AEGIS é a movimentação NoSQL, um grupo de desenvolvedores que desafiam a idéia de que todos os dados é/será/deve ser armazenado em um sistema de banco de dados relacional de alguma forma abertamente. Tabelas, linhas, colunas, chaves primárias, restrições de chave externa e argumentos de valores nulos e se uma chave primária deve ser um natural ou artificiais … é nada sagrado?

Neste artigo e seus sucessores, examinarei uma das principais ferramentas defendidas por aqueles no movimento NoSQL: MongoDB, cujo nome é proveniente de “ hu mongo us, ” de acordo com para o site MongoDB (e não, eu sou não fazendo que). A maioria dos tudo MongoDB ish será abordado: instalando, explorando e trabalhar com ele do .NET Framework, incluindo o suporte a LINQ oferecida; usando-lo de outros ambientes (aplicativos da área de trabalho e aplicativos Web e serviços) e como configurá-lo para que os administradores do Windows de produção Don gravar em effigy.

Problema (ou, por que eu Care, novamente?)

Antes de obter muito profunda os detalhes dos MongoDB, é justo perguntar por que os desenvolvedores .NET Framework devem sacrifica a próxima meia mais ou menos suas vidas lendo este artigo e acompanhando em seus laptops. Afinal, SQL Server vem em uma edição Express gratuita e redistribuível que fornece uma opção de armazenamento de dados leve que o banco de dados relacional o tradicional ligados a empresa ou data center, certamente, existem muitas ferramentas e bibliotecas disponíveis para fornecer mais fácil acesso a ele, inclusive da Microsoft LINQ e Estrutura de Entidade.

O problema é que a força do modelo relacional — modelar o relacional propriamente dito — é também sua maior vulnerabilidade. A maioria dos desenvolvedores se NET, Java ou alguma outra coisa totalmente, pode — após somente ’ alguns anos de experiência — Descreva em detalhes doloroso como tudo o que não cabe perfeitamente em um modelo de “ quadrada ” de tabelas, linhas/colunas. Tentativa de modelo de dados hierárquicos pode direcionar a desenvolvedores até mesmo mais experiente completamente bonkers, tanto assim que José Celko escreveu um livro — “ SQL para Smarties, terceira edição ” (Morgan Kaufmann, 2005) — totalmente sobre o conceito de dados hierárquicos em um modelo relacional de modelagem. E se você adicionar a esta o básico “ determinado ” relacionais ou bancos de dados pressupõem uma estrutura inflexível aos dados — o esquema do banco de dados — tentando oferecer suporte “ additionals ” ad hoc para os dados se torna complicado. (Rápida, levantem as mãos: Quantos de vocês aí trabalhar com bancos de dados que tem uma coluna de notas, ou ainda melhor, Nota1, Note2, Note3 …?)

Ninguém no movimento NoSQL irá sugerir que o modelo relacional não tem seus pontos fortes ou que o banco de dados relacional vai desaparecer, mas um fato da vida de desenvolvedor no passado duas décadas básico é que os desenvolvedores freqüentemente armazenou dados em bancos de dados relacionais que não seja inerentemente (ou, às vezes, até mesmo remotamente) relacional por natureza.

O banco de dados orientadas a documento armazena “ documentos ” (rigidamente knit coleções de dados que geralmente não estão conectados a outros elementos de dados do sistema) em vez de “ relações. ” Por exemplo, as entradas de blog em um sistema de blog são não totalmente conectadas umas às outras, e mesmo quando um faz referência a outro, com mais freqüência a conexão é por meio de um hiperlink se destina a ser referência cancelada pelo navegador do usuário, não internamente. Comentários sobre essa entrada de blog são totalmente delimitados para essa entrada de blog, e raramente fazer os usuários nunca deseja ver a agregação de todos os comentários, independentemente da entrada que comentar a eles.

Além disso, bancos de dados orientados a documento tendem a do excel em ambientes de alto desempenho ou alta-concorrência; MongoDB é especialmente voltados para alto desempenho, enquanto um fechamento primo dele, CouchDB, tem como objetivo mais em cenários de alta simultaneidade. Algum suporte a transações multi-object forgo, o que significa que embora eles ofereçam suporte à modificação simultânea de um único objeto em um banco de dados, permite que qualquer tentativa de modificar mais de um de cada vez uma pequena janela de tempo em que essas modificações podem ser vistas “ na passagem. ” Documentos são atualizados atomicamente, mas não há conceito de uma transação que se estende por vários documentos atualizações. Isso não significa que MongoDB não tem qualquer durabilidade — apenas significa que a instância MongoDB não vai sobreviver a uma falha de energia, bem como uma instância é do SQL Server. Sistemas semântica de (ACID) atomicidade, consistência, isolamento e durabilidade de completa que requerem é melhor desativar com sistemas de banco de dados relacionais tradicionais, para que dados de missão crítica provavelmente não estar vendo o interior de uma instância MongoDB sempre em breve, exceto talvez como dados armazenados em cache ou replicados vivendo em um servidor Web.

Em geral, MongoDB funcionará bem para aplicativos e componentes que precisam armazenar dados que podem ser acessados rapidamente e são usados com freqüência. Análise de site da Web, as preferências do usuário e as configurações — e qualquer tipo de sistema no qual os dados não está totalmente estruturados ou precisam ser estruturalmente flexível — são candidatos naturais MongoDB. Isso não significa que MongoDB não está totalmente preparado para ser um armazenamento de dados principal para dados operacionais; significa apenas que MongoDB funciona bem em áreas que não tenha RDBMS tradicional, bem como um número de áreas que poderiam ser servida por um.

Guia de Introdução

Como mencionado anteriormente, MongoDB é um pacote de software de código-fonte aberto facilmente download na MongoDB Web, mongodb.com. Abrindo a Web site em um navegador deve ser suficiente para encontrar links para o conjunto de binário para download Windows; examine o lado direito da página para o link Downloads. Ou, se você preferir links diretos, use mongodb.org/Display/DOCS/Downloads. Como da redação deste artigo, a versão estável é o 1.2.4 versão. Ele é nada mais do que um pacote de arquivo .zip, portanto, instalá-lo, comparativamente fala, ridiculamente fácil: Descompacte apenas o conteúdo em qualquer local desejado.

A sério. É isso.

O arquivo .zip ultrapassa o limite em três diretórios: bin, incluir e lib. O diretório somente de interesse é bin, que contém oito executáveis. Nenhuma dependência de binário (ou tempo de execução) é necessária e, na verdade, apenas dois desses executáveis são de interesse no momento. São mongod.exe, o próprio processo de banco de dados MongoDB e mongo.exe, o cliente de shell da linha de comando, que é geralmente usado da mesma maneira como o cliente de shell da linha de comando do antigo isql.exe do SQL Server — para certificar-se de que as coisas estão instaladas corretamente e funcionando; pesquisar diretamente; os dados e executar tarefas administrativas.

Verificar tudo instalado corretamente é tão fácil quanto de acionamento até mongod de um cliente de linha de comando. Por padrão, MongoDB deseja armazenar dados em c:\data\db, o caminho padrão do sistema de arquivos, mas isso é configurável com um arquivo de texto passado pelo nome na linha de comando via--config. Presumindo que existe um subdiretório chamado db onde mongod será iniciado, verificando se tudo está kosher é tão fácil quanto o que você vê no Figura 1.

image: Firing up Mongod.exe to Verify Successful Installation

Figura 1 Mongod.exe para verificar a instalação bem-sucedida de acionamento

Se o diretório não existir, MongoDB não irá criá-lo. Observe que na caixa meu Windows 7, quando MongoDB é iniciado, a caixa de diálogo usual “ este aplicativo deseja abrir uma porta ” aparece. Certifique-se de que a porta (27017 por padrão) esteja acessível ou conectar-se a ela serão … estranho, com melhor desempenho. (Falaremos mais sobre isso em um artigo subseqüente, quando eu discutir colocando MongoDB em um ambiente de produção.)

Quando o servidor estiver sendo executado, conectar-se a ela com o shell é apenas tão trivial — o aplicativo mongo.exe inicia um ambiente de linha de comando que permite a interação direta com o servidor, conforme mostrado no Figura 2.

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

Figura 2 Mongo.exe lança um ambiente de linha de comando que permite a interação direta com o servidor

Por padrão, o shell conecta-se ao banco de dados do teste de “ ”. Como o objetivo aqui é apenas verificar se tudo está funcionando, o teste foi estabelecida. Obviamente, a partir daqui é razoavelmente fácil criar alguns dados de exemplo para trabalhar com MongoDB, como um objeto rápido descreve uma pessoa. É uma rápida amostra em como MongoDB exibe dados para a inicialização, como podemos ver na Figura 3.

image: Creating Sample Data

Figura 3 Criando dados de exemplo

Essencialmente, MongoDB usa JavaScript Object Notation (JSON) como a notação de dados, que explica sua flexibilidade e da maneira em que os clientes irão interagir com ele. Internamente, MongoDB armazena as coisas de BSON, um superconjunto de binário de JSON, para armazenamento mais fácil e indexação. JSON permanece formato preferido de entrada/saída do MongoDB, no entanto e geralmente é o formato documentado usado entre o site do MongoDB e wiki. Se você não estiver familiarizado com a JSON, ele é uma boa idéia para o pincel nele antes de entrar muito nos MongoDB. Enquanto isso, apenas para grins, peer para o diretório no qual mongod está armazenando dados e você verá que alguns de teste de “ ” - nomeado arquivos foram gravadas.

Suficiente reprodução — tempo para escrever um código. Encerrar o shell é tão fácil quanto digitar “ sair ” e desligando o servidor requer somente um CTRL+C na janela ou fechá-lo; o servidor captura o sinal de fechamento e desligado tudo corretamente antes de sair do processo.

Servidor do MongoDB (e o shell, embora não seja o máximo de um problema) é gravado como um aplicativo C++ nativo — Lembre-se aos? — para acessá-lo requer algum tipo de driver do .NET Framework que sabe como se conectar através de soquete aberto de alimentação de comandos e dados. A distribuição MongoDB não possui um driver do .NET Framework fornecido com ele, mas felizmente a comunidade tiver fornecido um, onde “ a comunidade ”, nesse caso, é um desenvolvedor pelo nome do SAM Corder, que desenvolveu um driver do .NET Framework e oferecer suporte a LINQ para acessar MongoDB. Seu trabalho está disponível na origem e de formato binário, de github.com/samus/mongodb-CSharp. Baixe um os binários da página (procure no canto superior direito) ou as fontes e compilá-lo. De qualquer forma, o resultado é dois assemblies: MongoDB.Driver.dll e MongoDB.Linq.dll. Uma rápida Adicionar referência para o nó Referências do projeto e o .NET Framework está pronto para rock.

Escrevendo código

Fundamentalmente, abrir uma conexão com um servidor em execução MongoDB não é muito diferente de abrir uma conexão com qualquer outro banco de dados, como mostra a Figura 4.

Figura 4 Abrindo uma conexão a um servidor 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();
    }
  }
}

Não detectar o objeto criado anteriormente é difícil, apenas … diferente do … o que os desenvolvedores do .NET Framework que usou (consulte Figura 5).

Figura 5 Detectando um objeto criado 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 isso parecer um pouco complicado, relaxe — ele é gravado “ longo caminho ” porque MongoDB armazena coisas de forma diferente de bancos de dados tradicionais.

Para começar, lembre-se de que os dados inseridos anteriormente tinham três campos nele — firstname, lastname e idade e qualquer um desses são elementos pelos quais os dados podem ser recuperados. Mas o mais importante é que a linha armazenado-los, para cavalierly em vez disso, foi “ test.things.save () ” — que implica que os dados estiverem sendo armazenados em algo chamado “ coisas. ” Na terminologia MongoDB, “ coisas ” são uma coleção e implicitamente todos os dados são armazenados em uma coleção. Coleções por sua vez armazenar documentos, que mantêm pares chave/valor no qual os valores podem ser coleções adicionais. Nesse caso, “ coisas ” é uma coleção armazenada dentro de um banco de dados, como mencionado anteriormente é o banco de dados de teste.

Como resultado, buscando os dados significa que conectar-se primeiro para o servidor MongoDB e, em seguida, para o banco de dados de teste e, em seguida, encontrar a coleção “ coisas. ” Isso é que as quatro primeiras linhas Figura 5 fazer — criar um objeto mongo que representa a conexão, conecta-se ao servidor, conecta-se ao banco de dados do teste e, em seguida, obtém a coleção de “ coisas ”.

Depois que a coleção retornada, o código pode emitir uma consulta para localizar um único documento por meio de chamada FindOne. Mas com todos os bancos de dados, o cliente não desejar buscar cada documento na coleção e, em seguida, localizar o item está interessada em — alguma forma, a consulta precisa ser restringido. Em MongoDB, isso é feito criando um documento que contém os campos e dados para procurar nesses campos, um conceito conhecido como consulta por exemplo, ou QBE abreviada. Como o objetivo é localizar o documento que contém um campo lastname cujo valor é definido como “ Neward ”, um documento que contém o sobrenome de um campo e seu valor é criado e passado como o parâmetro para FindOne. Se a consulta for bem-sucedida, retorna outro documento que contém todos os dados em questão (mais de um campo mais); caso contrário retorna nulo.

A propósito, a versão abreviada dessa descrição pode ser tão simples como:

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

Quando executado, não apenas fazer os valores originais enviados em aparecer, mas um novo, aparece um campo _id que contém um objeto de ID de objeto. Esse é o identificador exclusivo para o objeto e silenciosamente foi inserido pelo banco de dados quando os novos dados foi armazenados. Qualquer tentativa de modificar esse objeto deve preservar esse campo ou o banco de dados presumirá é um novo objeto sendo enviado na. Normalmente, isso é feito modificando o documento foi retornado pela consulta:

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

No entanto, sempre é possível criar uma nova instância do documento e manualmente preencha o campo _id para corresponder à ID de objeto, caso faça mais sentido:

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")));

É claro que, se o _id já for conhecido, que pode ser usado como critério de consulta.

Observe que o documento é efetivamente não tipado — quase tudo que pode ser armazenado em um campo por qualquer nome, incluindo alguns tipos de valor de .NET Framework principais, como DateTime. Tecnicamente, como mencionado, MongoDB armazena dados BSON, que inclui algumas extensões de tipos tradicionais de JSON (string, inteiro, Boolean, double e nulo — Embora valores nulos são permitidos somente em objetos, não em coleções), como o ObjectId mencionado anteriormente, dados binários, expressões regulares e código JavaScript incorporado. Por enquanto, deixaremos o último dois sozinho — o fato de que BSON pode armazenar dados binários significa que tudo o que pode ser reduzido a uma matriz de bytes pode ser armazenado, que significa que MongoDB pode armazenar qualquer coisa, que talvez não seja capaz de consultar desse blob binário.

Não inativo (ou concluído) ainda!

Há muito mais para discutir sobre MongoDB, incluindo suporte a LINQ; fazendo consultas mais complexas do lado do servidor que excedem as capacidades de consulta QBE estilo simples mostradas até agora; e Obtendo MongoDB Felizmente viver em um farm de servidores de produção. Mas por enquanto, este artigo e um exame cuidadoso do IntelliSense devem ser suficiente para que o programador de trabalho foi iniciado.

A propósito, se houver um tópico específico que você gostaria de ver exploradas, Don hesite em me soltar uma anotação. De forma bastante real, é sua coluna, afinal de contas. Codificação feliz!

Ted Neward é uma entidade com Neward & Associates, uma empresa independente especializado em sistemas da plataforma .NET Framework e Java enterprise. Ele escreveu mais de 100 artigos, é um MVP translation from VPE for Csharp, palestrante da INETA e tem autor e co-autor de uma dúzia livros, incluindo o disponível em breve “ Professional F # 2.0 ” (Wrox). Ele consulta e mentors regularmente — entrar em ted@tedneward.com ou ler seu blog em blogs.tedneward.com.

Graças aos seguintes especialistas técnicos para revisar este artigo: Kyle Banker e Sam Corder