Pregunta

Estoy usando lo que parece ser un truco común para la creación de una vista conjunta:

// 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);
  }
}

Sé que puedo utilizar la siguiente consulta para obtener una sola customer y todas Orders relacionados:

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

Pero ahora he atado mi consulta muy de cerca a mi código de la vista. ¿Hay un valor que puede poner donde pongo mi "2" decir más claramente: "Quiero todo atada a este cliente"? Creo que he visto

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

Pero no estoy seguro de que es {} seguro para ordenar después todo lo demás.

cmlenz para el método de unirse.

Para cualquier aclaración de la página wiki CouchDB en el cotejo :

  

El startkey=["foo"]&endkey=["foo",{}] consulta coincidirá con la mayoría de las claves de matriz con "foo" en el primer elemento, como ["foo","bar"] y ["foo",["bar","baz"]]. Sin embargo, no coincidirá con ["foo",{"an":"object"}]

Así {} es finales en el orden de clasificación, pero definitivamente no es última .

¿Fue útil?

Solución

En lugar de tratar de encontrar el más valor posible para el segundo elemento en su clave de la matriz, sugeriría lugar tratando de encontrar el menos posible valor mayor que el primero . ?startkey=["some_customer_id"]&endkey=["some_customer_id\u0000"]&inclusive_end=false

Otros consejos

Tengo dos pensamientos.

Utiliza marcas de tiempo

En lugar de utilizar simples 0 y 1 por su comportamiento intercalación, utilice una marca de tiempo que se creó el registro (suponiendo que son parte de los registros) a la [doc._id, doc.created_at]. Posteriormente, se podría consultar su visión con una startkey de una fecha suficientemente temprana (época probablemente funcionaría), y un endkey de "ahora", por ejemplo date +%s. Ese rango de teclas siempre debe incluir todo, y tiene la ventaja añadida de cotejo por fecha, que es probablemente lo que usted quiere de todos modos.

o, simplemente no se preocupe

Se podía por el índice de customer_id y nada más. Esto tendría la ventaja de ser agradable capaz de consultar utilizando sólo key=<customer_id>. Claro, los registros no serán cotejados cuando regresan, pero es que es un problema para su aplicación? A menos que usted está esperando toneladas de discos atrás, probablemente sería trivial para simplemente arrancar el registro del cliente fuera de la lista una vez que tenga los datos recuperados por la aplicación.

Por ejemplo, en rubí:

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

En cualquier caso, las marcas de tiempo es probablemente la respuesta más atractivo para su caso.

CouchDB está escrito principalmente en Erlang. No creo que habría un límite superior para un compuesto de cadena / tupla clave compuesta tamaños distintos recursos del sistema (por ejemplo, una llave tan larga que utiliza toda la memoria disponible). Los límites de CouchDB escalabilidad son desconocidos según el sitio CouchDB. Me imagino que usted podría seguir añadiendo campos en una enorme llave primaria compuesta y la única cosa que lo deje que son los recursos del sistema o los límites duros, como los tamaños enteros máximo en la arquitectura de destino.

Desde CouchDB tiendas de todo utilizando JSON, que probablemente se limita a los valores de los números más grandes de los números de ECMAScript standard.All en JavaScript se almacenan como un punto flotante IEEE 754 doble. Creo que el doble de 64 bits puede representar los valores de -. 5e-324 a + 308 + 1.7976931348623157e

Parece que sería bueno tener una característica que endKey podría ser inclusivo en lugar de exclusivo.

Esto debería hacer el truco:

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

Esto debe incluir cualquier cosa que comienza con un carácter menos de \ uFFFF (todos los caracteres Unicode)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top