Pergunta

Estou usando o que parece ser um truque comum para criar uma visão de junção:

// a Customer has many Orders; show them together in one view:
function(doc) {
  if (doc.Type == "customer") {
    emit([doc._id, 0], doc);
  } else if (doc.Type == "order") {
    emit([doc.customer_id, 1], doc);
  }
}

Eu sei que posso usar a seguinte consulta para obter um único customer e tudo relacionado Orders:

?startkey=["some_customer_id"]&endkey=["some_customer_id", 2]

Mas agora eu amarrei minha consulta muito intimamente do meu código de visualização. Existe um valor que eu posso colocar onde coloquei meu "2"Para dizer com mais clareza", eu quero tudo amarrado a este cliente "? Eu acho que vi

?startkey=["some_customer_id"]&endkey=["some_customer_id", {}]

Mas não tenho certeza disso {} é certo ordenar depois todo o resto.

Crédito para cmlenz Para o método de junção.

Mais esclarecimentos do Página wiki do Couchdb em agrupamento:

A pergunta startkey=["foo"]&endkey=["foo",{}] combinará com a maioria das teclas de matriz com "foo" no primeiro elemento, como ["foo","bar"] e ["foo",["bar","baz"]]. No entanto, não combinará ["foo",{"an":"object"}]

Então {} é tarde na ordem de classificação, mas definitivamente não último.

Foi útil?

Solução

Em vez de tentar encontrar o o melhor Valor possível para o segundo elemento em sua chave de matriz, eu sugiro, em vez disso, tentar encontrar o ao menos valor possível maior que o primeiro: ?startkey=["some_customer_id"]&endkey=["some_customer_id\u0000"]&inclusive_end=false.

Outras dicas

Eu tenho dois pensamentos.

Use timestamps

Em vez de usar 0 e 1 simples para o seu comportamento de agrupamento, use um registro de data e hora que o registro foi criado (assumindo que eles façam parte dos registros) à la [doc._id, doc.created_at]. Então você pode consultar sua opinião com um StartKey de uma data suficientemente precoce (a época provavelmente funcionaria) e uma chave final de "agora", por exemplo, date +%s. Esse intervalo de chaves deve sempre incluir tudo, e tem o benefício adicional de colar por data, o que é provavelmente o que você deseja de qualquer maneira.

Ou, só não se preocupe com isso

Você pode apenas indexar pelo cliente_id e nada mais. Isso teria a boa vantagem de poder consultar usando apenas key=<customer_id>. Claro, os registros não serão coletados quando voltarem, mas esse é um problema para o seu aplicativo? A menos que você esteja esperando toneladas de registros de volta, provavelmente seria trivial simplesmente retirar o registro do cliente da lista depois de obter os dados recuperados pelo seu aplicativo.

Por exemplo, em Ruby:

customer_records = records.delete_if { |record| record.type == "customer" }

De qualquer forma, os registros de data e hora é provavelmente a resposta mais atraente para o seu caso.

O CouchDB é escrito principalmente em Erlang. Eu não acho que haveria um limite superior para um composto de string/tamanhos de tupla composta além dos recursos do sistema (por exemplo, uma chave por tanto tempo usava toda a memória disponível). Os limites da escalabilidade do CouchDB são desconhecidos de acordo com o site CouchDB. Eu acho que você poderia continuar adicionando campos a uma enorme chave primária composta e a única coisa que o impediria são os recursos do sistema ou limites rígidos, como tamanhos inteiros máximos na arquitetura de destino.

Como o CouchDB armazena tudo usando o JSON, provavelmente é limitado aos maiores valores de números pelo padrão ECMAScript. Todos os números no JavaScript são armazenados como um duplo IEEE 754 de ponto flutuante. Acredito que o duplo de 64 bits pode representar valores de-5E-324 a +1.7976931348623157E +308.

Parece que seria bom ter um recurso em que o endkey possa ser inclusivo em vez de exclusivo.

Isso deve fazer o truque:

?startkey=["some_customer_id"]&endkey=["some_customer_id", "\uFFFF"]

Isso deve incluir qualquer coisa que comece com um personagem menos que uffff (todos os caracteres unicode)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top