Quando patrocinamos conferências com essas atividades, geralmente perguntamos aos participantes se podemos escanear seus crachás para enviar-lhes algumas atualizações do Couchbase. Foi o que fizemos. E, às vezes, as informações são fáceis de recuperar, outras vezes são um pouco complicadas. Aqui, o código QR continha um VCard. A finalidade deles é manter informações de contato, informações preciosas - como você sabe, as digitalizações são a moeda das conferências. É o que nos permite voltar no ano seguinte com ainda mais sorvete.
De qualquer forma, acabamos coletando muitos VCards, mas era difícil colocá-los no formato de marketing onipresente, o CSV. Então, o que você faz quando precisa manipular dados? Você usa o Couchbase Shell.
Couchbase Shell, Shell Yeah!
Shell do Couchbase (cbsh) é um shell moderno, produtivo e divertido para o Couchbase Server e o Capella (nosso DBaaS na nuvem). O código-fonte e as instruções para instalá-lo estão disponíveis no repositório Leia-me.
Eu o instalei pessoalmente, clonando-o e construindo-o:
|
1 2 3 |
git clone https://github.com/couchbaselabs/couchbase-shell cd couchbase-shell cargo install --path . |
Você precisa ter o Cadeia de ferramentas do Rust instalado, porque o Couchbase Shell é escrito em Rust e baseado no meu shell favorito, nushell.
Depois de instalado, você pode executá-lo digitando cbsh. Ele solicitará que você configure primeiro uma conexão com o Couchbase. Se estiver usando a interface de gerenciamento do Capella, você obterá todas as informações necessárias na seção Conectar guia.
Nushell <3 JSON
Para fins de registro, este é o aspecto do meu VCard:
|
1 2 3 4 5 6 |
BEGIN:VCARD VERSION:2.1 N:DOGUIN;Laurent;;; ORG:Couchbase EMAIL;INTERNET:laurent.doguin@couchbase.com END:VCARD |
Há muitas bibliotecas de nós para transformar isso em JSON, eu usei cartão-json. Portanto, se eu executar node de vcard2json.jsSe eu não tiver um objeto JSON, obtenho uma matriz JSON com todo o conteúdo do VCard como um objeto JSON.
O que é ótimo, mas como isso pode ser manipulado facilmente? Como o Cbsh é baseado no nushell, temos todas as coisas boas que vêm com ele, como o de json ou o comando onde e o filtro JSON selecionar. Então, vamos ver como isso funcionaria passo a passo, com a saída de dados estruturados, também cortesia do nushell:
|
1 2 3 4 5 |
👤 Laurent Doguin 🏠 capella > node vcard2json.js [{"name":{"surname":"Doguin","name":"Laurent","additionalName":"","prefix":"","suffix":""},"organization":"Couchbase","email":[{"isDefault":false,"valueInfo":{},"value":"laurentdoguin@couchbase.com"}]},{"name":{"surname":"This","name":"Person","additionalName":"","prefix":"","suffix":""},"organization":"DoesNotWorkAtCouchbase","email":[{"isDefault":false,"valueInfo":{},"value":"thiperson@notcouchbase.com"}]}] |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
👤 Laurent Doguin 🏠 capella > node vcard2json.js | from json ╭───┬──────────────────────────────┬────────────────────────┬─────────────────────────────────────────────────────────────────────╮ │ # │ name │ organization │ email │ ├───┼──────────────────────────────┼────────────────────────┼─────────────────────────────────────────────────────────────────────┤ │ 0 │ ╭────────────────┬─────────╮ │ Couchbase │ ╭───┬───────────┬───────────────────┬─────────────────────────────╮ │ │ │ │ surname │ Doguin │ │ │ │ # │ isDefault │ valueInfo │ value │ │ │ │ │ name │ Laurent │ │ │ ├───┼───────────┼───────────────────┼─────────────────────────────┤ │ │ │ │ additionalName │ │ │ │ │ 0 │ false │ {record 0 fields} │ laurentdoguin@couchbase.com │ │ │ │ │ prefix │ │ │ │ ╰───┴───────────┴───────────────────┴─────────────────────────────╯ │ │ │ │ suffix │ │ │ │ │ │ │ ╰────────────────┴─────────╯ │ │ │ │ 1 │ ╭────────────────┬────────╮ │ DoesNotWorkAtCouchbase │ ╭───┬───────────┬───────────────────┬────────────────────────────╮ │ │ │ │ surname │ This │ │ │ │ # │ isDefault │ valueInfo │ value │ │ │ │ │ name │ Person │ │ │ ├───┼───────────┼───────────────────┼────────────────────────────┤ │ │ │ │ additionalName │ │ │ │ │ 0 │ false │ {record 0 fields} │ thiperson@notcouchbase.com │ │ │ │ │ prefix │ │ │ │ ╰───┴───────────┴───────────────────┴────────────────────────────╯ │ │ │ │ suffix │ │ │ │ │ │ │ ╰────────────────┴────────╯ │ │ │ ╰───┴──────────────────────────────┴────────────────────────┴─────────────────────────────────────────────────────────────────────╯ |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
👤 Laurent Doguin 🏠 capella > node vcard2json.js | from json | where organization != 'Couchbase' ╭───┬─────────────────────────────┬────────────────────────┬────────────────────────────────────────────────────────────────────╮ │ # │ name │ organization │ email │ ├───┼─────────────────────────────┼────────────────────────┼────────────────────────────────────────────────────────────────────┤ │ 0 │ ╭────────────────┬────────╮ │ DoesNotWorkAtCouchbase │ ╭───┬───────────┬───────────────────┬────────────────────────────╮ │ │ │ │ surname │ This │ │ │ │ # │ isDefault │ valueInfo │ value │ │ │ │ │ name │ Person │ │ │ ├───┼───────────┼───────────────────┼────────────────────────────┤ │ │ │ │ additionalName │ │ │ │ │ 0 │ false │ {record 0 fields} │ thiperson@notcouchbase.com │ │ │ │ │ prefix │ │ │ │ ╰───┴───────────┴───────────────────┴────────────────────────────╯ │ │ │ │ suffix │ │ │ │ │ │ │ ╰────────────────┴────────╯ │ │ │ ╰───┴─────────────────────────────┴────────────────────────┴────────────────────────────────────────────────────────────────────╯ |
|
1 2 3 4 5 6 7 |
👤 Laurent Doguin 🏠 capella > node vcard2json.js | from json | where organization != 'Couchbase' | select name.name name.surname organization email.0.value ╭───┬───────────┬──────────────┬────────────────────────┬────────────────────────────╮ │ # │ name_name │ name_surname │ organization │ email_0_value │ ├───┼───────────┼──────────────┼────────────────────────┼────────────────────────────┤ │ 0 │ Person │ This │ DoesNotWorkAtCouchbase │ thiperson@notcouchbase.com │ ╰───┴───────────┴──────────────┴────────────────────────┴────────────────────────────╯ |
Agora que os dados estão prontos e limpos, o que posso fazer com eles? Eu poderia escrever esses dados em um arquivo CSV como este:
|
1 |
> node vcard2json.js | from json | where organization != 'Couchbase' | select name.name name.surname organization email.0.value | to csv| save contacts.csv |
Eu também poderia gravá-lo no Couchbase. Já tenho minha credencial configurada. O primeiro comando escolhe o bucket, o escopo e a coleção padrão. O segundo itera pela matriz JSON, gera um UUID aleatório, agrupa o conteúdo em uma coluna de conteúdo e adiciona uma coluna de ID com o UUID gerado e, em seguida, insere o resultado no Couchbase.
|
1 2 3 |
👤 Laurent Doguin 🏠 capella > cb-env bucket vcard |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
👤 Laurent Doguin 🏠 capella in ☁️ vcard._default._default > node vcard2json.js | from json | where organization != 'Couchbase' |select name.name name.surname organization email.0.value |rename firstname lastname organization email | each { |it| let uuid = {random uuid}; $it | wrap content| insert id $uuid | doc upsert } ╭───┬───────────────────────────────────────────────────────────╮ │ 0 │ ╭───┬───────────┬─────────┬────────┬──────────┬─────────╮ │ │ │ │ # │ processed │ success │ failed │ failures │ cluster │ │ │ │ ├───┼───────────┼─────────┼────────┼──────────┼─────────┤ │ │ │ │ 0 │ 1 │ 1 │ 0 │ │ capella │ │ │ │ ╰───┴───────────┴─────────┴────────┴──────────┴─────────╯ │ │ 1 │ ╭───┬───────────┬─────────┬────────┬──────────┬─────────╮ │ │ │ │ # │ processed │ success │ failed │ failures │ cluster │ │ │ │ ├───┼───────────┼─────────┼────────┼──────────┼─────────┤ │ │ │ │ 0 │ 1 │ 1 │ 0 │ │ capella │ │ │ │ ╰───┴───────────┴─────────┴────────┴──────────┴─────────╯ │ ╰───┴───────────────────────────────────────────────────────────╯ |
E, para ter certeza de que está funcionando, os dados podem ser consultados diretamente com o SQL++:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
👤 Laurent Doguin 🏠 capella in ☁️ vcard._default._default > query "SELECT * from `vcard`" ╭───┬────────────────────────────────────────────────┬─────────╮ │ # │ vcard │ cluster │ ├───┼────────────────────────────────────────────────┼─────────┤ │ 0 │ ╭──────────────┬─────────────────────────────╮ │ capella │ │ │ │ firstname │ Person1 │ │ │ │ │ │ lastname │ LastNa │ │ │ │ │ │ organization │ Organisat │ │ │ │ │ │ email │ person1lastna@couchbase.com │ │ │ │ │ ╰──────────────┴─────────────────────────────╯ │ │ │ 1 │ ╭──────────────┬────────────────────────────╮ │ capella │ │ │ │ firstname │ Person │ │ │ │ │ │ lastname │ This │ │ │ │ │ │ organization │ DoesNotWorkAtCouchbase │ │ │ │ │ │ email │ thiperson@notcouchbase.com │ │ │ │ │ ╰──────────────┴────────────────────────────╯ │ │ ╰───┴────────────────────────────────────────────────┴─────────╯ |
Aqui está um exemplo prático de uso do Couchbase Shell para manipular dados, transformá-los e importá-los para o Couchbase. Mas há muitos outros usos para ele! Qual é o seu favorito?