Há alguns meses, eu estava conversando com alguns dos usuários do nosso cliente Node.js e ouvi uma opinião bastante comum de que as pessoas estavam procurando algum método para simplificar ainda mais sua vida ao usar o Couchbase a partir do Node.js. Uma coisa específica que ouvi muito foi que eles estavam procurando uma maneira de ter modelos gerados automaticamente para evitar a necessidade de construir manualmente todo o boilerplate.
Em resposta a isso, comecei a trabalhar em uma nova biblioteca conhecida como Ottoman. Ottoman é um ODM experimental projetado com base no Couchbase. Neste momento, acho que o Ottoman é suficientemente rico em recursos para que alguns olhos externos comecem a dar uma olhada. Sei que há bugs escondidos no código-fonte e recursos que podem ser aprimorados, mas gostaria da sua ajuda para fazer isso! Você é quem tem a melhor ideia do que deseja ver e do que seria mais benéfico para VOCÊ, portanto, quero ouvi-lo com o máximo de perguntas, comentários e/ou preocupações que possa ter.
Vamos às explicações!
O objetivo da biblioteca é permitir que você crie uma definição de como seria o seu modelo e, em seguida, fazer com que ela gere automaticamente todo o boilerplate que normalmente acompanha esse modelo. Como exemplo, dê uma olhada no seguinte:
'nome de usuário': 'string',
"nome: 'string',
'email': 'string'
}, {
balde: novo couchbase.Conexão({})
});
Este exemplo mostra como criar um modelo de usuário simples, que contém 5 campos (sim, 5, explicarei isso abaixo). Intuitivamente, ele contém 3 campos de cadeia de caracteres, que são nome de usuário, nome e e-mail. Além disso, há 2 oculto
campos que são adicionados e que podem ser substituídos. Esses campos são os campos _type e _id, que contêm uma cadeia de caracteres de qual modelo é esse documento, bem como uma cadeia de caracteres de identificação exclusiva, cujo padrão é usar um uuid UUIDv4.
Usar esse modelo recém-criado é extremamente simples, pois o objeto de retorno da função de modelo é uma função que pode ser usada para instanciar novas instâncias do modelo. Portanto, seguindo o exemplo acima, podemos criar e salvar um novo usuário com o seguinte:
teste.nome de usuário = 'brett19';
teste.nome = 'Brett Lawson';
teste.e-mail = 'brett19@gmail.com';
Otomana.salvar(teste, função(erro) {
se (erro) lançar erro;
console.registro('salvos');
});
Além disso, o Ottoman permite que você carregue rapidamente um objeto que foi armazenado anteriormente no banco de dados usando também findById, como este:
se (erro) lançar erro;
console.registro(obj.nome);
// Brett Lawson
});
Até agora, basicamente, vimos apenas algumas operações simples de carregamento/armazenamento que o Ottoman pode fazer. Vamos nos aprofundar um pouco mais e ver onde o Ottoman pode realmente ajudar a aumentar nossa produtividade. Digamos que estamos criando um site de blog e precisamos armazenar uma postagem de blog associada aos usuários. Vamos criar um modelo que nos permita fazer isso.
"criador: 'Usuário',
'título': 'string',
"conteúdo: 'string'
}, {
balde: …
});
Você pode ver aqui que um dos nossos tipos de campo na verdade se refere ao nosso objeto User criado acima. Isso nos permite criar um novo BlogPost que se refere a outro documento armazenado em nosso banco de dados. Você também pode configurar um modelo para ser incorporado. Digamos que queremos armazenar a localização GPS atual do usuário, bem como sua localização GPS quando ele faz uma postagem. Em vez de ser um documento referenciado normal, os dados serão incorporados diretamente em seus respectivos objetos, mas permanecerão como GPSPositions quando forem desserializados.
lat: 'número',
longo: 'número'
}, {
incorporar: verdadeiro
});
O último recurso interessante que gostaria de mencionar hoje é a capacidade de gerar automaticamente visualizações de mapa/redução que permitem realizar pesquisas básicas em nossos modelos. Gostaria de prefixar isso dizendo que esse recurso é muito experimental e só funciona para alguns dos casos de uso mais comuns. Além disso, ele tem a ressalva de precisar que você chame manualmente registrarDesignDocs
no objeto Ottoman depois que todos os seus modelos tiverem sido registrados, pois essa é a única maneira de determinar os vínculos entre os modelos. Além disso, regenerar essas exibições a cada inicialização do aplicativo seria terrivelmente ineficiente, por isso costumo fazer isso como uma espécie de fase de configuração
no momento.
Para levar nosso exemplo de blog ainda mais longe, digamos que precisássemos de uma lista dos posts de blog de nossos usuários. Normalmente, isso envolveria a criação manual de uma exibição para extrair essa lista, pesquisando todos os BlogPost na referência do criador para o usuário específico que estamos procurando. Com o Ottoman, isso é muito mais simples. Podemos simplesmente definir uma consulta nas propriedades do nosso objeto User da seguinte forma:
myPosts: {
alvo: 'BlogPost',
mapeadoPor: "criador,
classificar: 'desc',
limite: 5
}
},
Agora você pode solicitar as postagens feitas por um usuário simplesmente invocando o método myPosts em qualquer instância de usuário, e será retornada uma lista de objetos BlogPost que foram postados por esse usuário; a localização e a desserialização desses objetos são tratadas automaticamente.
Há muitos outros recursos suportados pelo Ottoman que não tenho tempo para mostrar hoje, mas se você quiser ver mais ou quiser ajudar a tornar o Ottoman ainda melhor, vá até a página do GitHub aqui: https://github.com/couchbaselabs/node-ottoman/ !
Saúde! Brett
Brett,
Passei algum tempo procurando um modelo de objeto para o Couch e me deparei com o NPM e agora com sua postagem no blog.
Você [e os outros usuários do Node.js] estão certos de que isso é extremamente necessário.
Detesto dizer isso, mas o Mongoose parece já ter acertado com os esquemas em termos de facilidade de uso, e isso nos aproxima um pouco mais do mundo do Couch. Mas não estou dizendo que a Mongoose tem tudo certo;)
A identificação e o tipo completamente transparentes/ocultos também são a melhor opção, na minha opinião (um a mais que o Mongoose aqui :)
Vou fazer um fork do Github e dar uma olhada.
Saúde,
-m
Olá, Marc,
Informe-me se tiver alguma dúvida sobre o código-fonte ou sobre o Ottoman em geral. Há muitos recursos que ainda estou trabalhando para documentar. Além disso, o código-fonte deve ser bastante simples de navegar, exceto o código de consulta que ainda está sendo prototipado.
Abraços, Brett
bom trabalho! direção certa! Comecei a trabalhar em um adaptador sailsjs (http://sailsjs.org/#!documenta.... Vou dar uma olhada no pufe e em seus conceitos
Oi Brett,
Obrigado por esse trabalho e concordo plenamente com @disqus_gkZwtATXIN:disqus quando diz que há uma lacuna no Mongoose que seria ótima se pudéssemos fechar com o Ottoman. Estou lendo \"Sams teach yourself Node.js in 24 hours\" e eles usam muito o Mongoose em sua seção de exemplos, o que me faz invejar o usuário do MongoDB que tem facilidade com tudo.
Dito isso, e, por favor, perdoe-me como um aprendiz de Node.js e Noob, pois estou testando meu primeiro aplicativo em Node.js. No momento, estou em uma etapa em que estou adicionando dados de várias fontes e gostaria de ver uma função no Ottoman que exclua apenas um esquema específico (ou, na linguagem do Ottoman, um modelo) com um simples comando.
Não sei se isso foi entendido, mas o que eu quero é um quadro limpo, pois estou testando como lidar com várias entradas com o mesmo ID e, se os dados da última execução estiverem dentro do quadro, haverá um erro em todos os registros (não apenas naqueles que são realmente duplicados).
A comunidade do Node.js no CouchBase ainda é muito pequena, ao que parece, mas, como podemos ver no caso do Viber, há cada vez mais empresas que veem \"a luz\" e fazem a transição.
Obrigado por seu trabalho nisso, @brettlawson:disqus!
Olá, Andreas,
Agradeço por ter dedicado seu tempo para divulgar suas ideias aqui! Concordo que há algumas coisas que são mais difíceis de concluir com o Couchbase, e estamos trabalhando duro para tentar preencher essa lacuna para os desenvolvedores. Infelizmente, não é trivial excluir todos os dados de um subconjunto específico de seus dados no momento (embora possamos criar uma exibição que nos permita fazer isso). No entanto, para o seu caso de uso, posso sugerir o uso do comando \'flush\' do banco de dados, que erradicará completamente os dados em um determinado bucket ou, melhor ainda, no caso de execução de testes, talvez o uso do mock do Node.js seja uma solução melhor, pois é uma ferramenta poderosa para testes e é muito mais rápida do que usar um cluster real!
Abraços, Brett
Obrigado por sua ajuda @brettlawson:disqus e já implementei o FLUSH. Dei uma olhada no mock do Node.js e há muitos diferentes. Como de costume, é difícil identificar "a melhor" solução. Você tem alguma que prefira em relação às outras quando se trata de "simulação"?
Oi Brett,
Ótimo começo aqui. A meu ver, o ODM é realmente o elo que faltava na pilha Couch/Node e o Mongoose está rapidamente tornando o uso do Couch versus o uso do Mongo uma opção cada vez menos atraente.
Qual é a probabilidade de esse projeto chegar ao nível de recursos/robustez do Mongoose? Esse é um projeto secundário ou principal na CB?
Obrigado! CM
Olá, CM!
Na verdade, o Ottoman já é extremamente cheio de recursos, mas a maioria desses recursos ainda não foi documentada. Esse é, de fato, um projeto de primeira linha, mas estamos atualmente no processo de refatoração de nossos clientes básicos e, portanto, o desenvolvimento tem sido lento. Além disso, ainda não tivemos um número significativo de pessoas demonstrando interesse no projeto. Você tem alguma opinião sobre o projeto?
Abraços, Brett
Como sou novo no Couchbase, tenho cometido alguns erros ao tentar
migrar um sistema do MongoDB para o Couchbase, especialmente com relação a
o design das exibições/índices. Espero que alguém possa me ajudar.
Acabei de me deparar com esta página do aplicativo de treinamento couchbase. Faz sentido adicionar ottoman. Linhas semelhantes às ferramentas ORM no mundo relacional - quase todo banco de dados nosql deve precisar dele - http://www.fromdev.com/2012/07…
E quanto aos seus planos de compatibilidade com o cross nosql? Ou ela será específica apenas para o couchbase.
O Ottoman ainda é mantido? Se não, qual seria o melhor ODM para o Couchbase em NodeJS?
Aqui está outro odm do couchbase que você pode experimentar:
https://github.com/fogine/couc…
Oi Brett,
Sou novo no Couch Base e no Ottoman, o motivo para mudar para o Couch Base foram as visualizações suportadas. Eu li em blogs que o Ottoman oferece suporte à interação com visualizações no Couch Base via API, mas não consegui encontrar o mesmo. Você poderia me ajudar indicando alguma documentação onde eu possa ler e explorar o suporte da API para a interação de visualizações no Ottoman?
agradecimentos
Gaurav
[...] Blog da Semana: Node.js ODM para Couchbase (Ottoman) [...]