A API de subdocumento - go
Você provavelmente já ouviu falar sobre o subdocumento (subdoc) API disponível no couchbase 4.5. Mark Nunberg, um dos arquitetos da nova API, tem um ótimo blog sobre a motivação e o ímpeto por trás da extensão da API do Memcached (valor-chave) para oferecer suporte a operações de subdocumento. Matthew Revell também elaborou um ótimo amostra usando Java e Python. Se você for como eu, vai querer ver qualquer novo recurso expresso em sua(s) linguagem(ns) preferida(s). Para mim, isso significa go ou nodejs. Vamos dar uma olhada em um exemplo e ver como a API funciona em go.
Editar: Esta postagem do blog foi editada com atualizações da versão 4.5 Beta
Para conhecer outros recursos do Couchbase 4.5, consulte as postagens do blog de Don Pinto sobre o Visualização do desenvolvedor e o Beta.
Vamos começar com uma estrutura json simples, com três campos
Crie um documento usando a estrutura que definimos e "insira-o" no couchbase
Agora, vamos adicionar uma matriz ao documento que criamos em um novo campo e, em seguida, executar algumas operações adicionais na matriz. Com a mágica da API de subdoc, podemos fazer tudo isso sem precisar recuperar ou atualizar o documento inteiro. Isso economiza tempo e largura de banda, além de melhorar consideravelmente o desempenho.
O que acabou de acontecer? Preciso de um construtor!
A API go para operações de subdocumento adiciona dois novos métodos ao tipo Bucket: LookupIn() e MutateIn(). Essas operações em nível de bucket são consistentes em todos os SDKs do couchbase. Se você estiver usando go, nodejs, Java, .NET, C ou Python, todas elas funcionam da mesma maneira. Essa é uma boa conveniência para a portabilidade do código, pois raramente vemos um ambiente de produção com apenas uma linguagem em toda a pilha. Vamos dar uma olhada no que esses dois novos métodos do tipo Bucket fazem nos bastidores:
Mutação
Vejamos o MutateInBuilder, usado para combinar uma ou mais operações de mutação com escopo em um único documento: func (b *Bucket) MutateIn(key string, cas Cas, expiry uint32) *MutateInBuilder. Essa função inclui um método receptor para o tipo Bucket e retorna uma referência ao MutateInBuilder

O MutateInBuilder tem dez métodos:
- AddUnique():
func (set *MutateInBuilder) AddUnique(path string, value interface{}, createParents bool) *MutateInBuilderEsse método adiciona um valor exclusivo a um campo de matriz existente. Ele verifica se o valor existe primeiro e o atualiza. Ele retorna uma referência a umMutateInBuilder - ArrayInsert():
func (set *MutateInBuilder) ArrayInsert(path string, value interface{}) *MutateInBuilderEsse método insere um valor de matriz em um campo de matriz de um documento. ObservaçãoEm nosso exemplo acima, passamos uma string que representa a matriz e o índice: "fourthItem[2]". Ele retorna uma referência a umMutateInBuilder - Counter():
func (set *MutateInBuilder) Counter(path string, delta int64, createParents bool) *MutateInBuilderEsse método executa uma operação de contador atômico em um campo de um documento. Ele retorna uma referência a umMutateInBuilder - Insert():
func (set *MutateInBuilder) Insert(path string, value interface{}, createParents bool) *MutateInBuilderEsse método insere um novo valor em um local específico de um documento. Ele retorna uma referência a umMutateInBuilder - PushBack():
func (set *MutateInBuilder) PushBack(path string, value interface{}, createParents bool) *MutateInBuilderEsse método adiciona um novo valor ao final de um campo de matriz em um documento. Ele retorna uma referência a umMutateInBuilder - PushFront():
func (set *MutateInBuilder) PushFront(path string, value interface{}, createParents bool) *MutateInBuilderEsse método adiciona um novo valor ao início de um campo de matriz em um documento. Ele retorna uma referência a umMutateInBuilder - Remove():
func (set *MutateInBuilder) Remove(path string) *MutateInBuilderEsse método remove um valor de um campo específico de um documento. Ele retorna uma referência a umMutateInBuilder - Replace():
func (set *MutateInBuilder) Replace(path string, value interface{}) *MutateInBuilderEsse método substitui um valor em um campo de um documento. Ele retorna uma referência a umMutateInBuilder - Upsert():
func (set *MutateInBuilder) Upsert(path string, value interface{}, createParents bool) *MutateInBuilderEsse método adiciona ou substitui um campo em um documento. Ele retorna uma referência a umMutateInBuilder - Execute():
func (set *MutateInBuilder) Execute() (*DocumentFragment, error)Esse método envia as operações encadeadas ao servidor e retorna umFragmento de documentocontendo seus resultados.
O fluxo lógico para MutateIn() tem o seguinte aspecto

Pesquisa
Vamos dar uma olhada no LookupInBuilder, que nos permite declarar uma ou mais operações de recuperação com escopo de um único documento: func (b *Bucket) LookupIn(key string) *LookupInBuilder. Essa função inclui um método receptor para o tipo Bucket e retorna uma referência ao LookupInBuilder.

O LookupInBuilder tem três métodos:
- Get():
func (set *LookupInBuilder) Get(path string) *LookupInBuilderEsse método solicita que o conteúdo do caminho seja recuperado. Retorna uma referência a umLookupInBuilder - Exists():
func (set *LookupInBuilder) Exists(path string) *LookupInBuilderVerifica se o caminho fornecido existe. Retorna uma referência a umLookupInBuilder - Execute():
func (set *LookupInBuilder) Execute() (*DocumentFragment, error)Esse método envia os comandos encadeados ao servidor e retorna uma referência a umFragmento de documento(contendo os resultados) e um tipoerrose for encontrado um.
O fluxo lógico para LookupIn()tem o seguinte aspecto

Próximas etapas
Por que não tentar você mesmo? O exemplo acima, juntamente com vários outros exemplos de go, pode ser encontrado em nosso repositório de guias do desenvolvedor em github Uma ótima maneira de começar e experimentar o couchbase 4.5 (em versão beta no momento da publicação) é com o docker. A imagem do docker do couchbase 4.5 pode ser carregada se você tiver o docker instalado com o seguinte comando:
docker run -d --name=CB45DP1 -p 8091-8093:8091-8094 -p 11207-11210:11207-11210 -p 18091-18092:18091-18092 couchbase/server:enterprise-4.5.0-Beta
Nós gostamos de receber feedback - experimente e diga-nos o que você achou.