2010-07-20 14 views
5

Los id de RDBMS en números enteros son generalmente simples que van desde 0 a cualquier número, pero por lo general se puede mantener en el rango de 5 dígitos para que pueda hacer que las direcciones URL que se ven asíPara los desarrolladores que usan mongodb para construir sus aplicaciones web, ¿qué haces con las claves principales largas?

myawesomeblog.com/posts/23456

pero con mongodb los identificadores únicos para cada registro se ven así. 47cc67093475061e3d95369d

y la construcción y aplicación sobre la base de que llevaría a las URL como esta myawesomeblog.com/posts/47cc67093475061e3d95369d

no me gusta eso? ¿Hay alguna forma de hacer que mongo te proporcione números de identificación basados ​​en números enteros que sean más cortos y únicos? (Como MySQL)

Respuesta

1

Aquí hay un enlace para crear un valor incremental de la DOC

http://www.mongodb.org/display/DOCS/Atomic+Operations#AtomicOperations-%22InsertifNotPresent%22 
+0

Sí, ya vi eso, no tenía mucho sentido para mí. ¿A dónde va esa función? En el código fuente de Mongo? ¿Reescrito para ruby? – concept47

+1

Todo lo que hace efectivamente es extraer cada resultado y su campo ID para incrementar un valor. Puede almacenarlo en mongo (como un procedimiento almacenado) y simplemente hacer referencia a él cada vez. http://en.wikipedia.org/wiki/MongoDB#Server-Side_JavaScript_Execution http://neovintage.blogspot.com/2010/07/mongodb-stored-javascript-functions.html –

1

Una forma que he intentado (y parece que funciona) es la creación de una colección de secuencias con documentos como:

{name: "Mensajes", Valor: 12345, _id: ObjetoID ("47cc67093475061e3d95369d")}

Antes de la inserción en la colección de mensajes, que le agarra la secuencia actual con el nombre de "Mensajes" y el incremento es valioso. A continuación, utilice ese valor como ID amigable para URL o como Id. De objeto para su nuevo documento de publicación.

Este enfoque es similar a utilizar SELECT SELECT de Oracle SEQ.NEXTVAL FROM DUAL como claves principales.

No es perfecto, pero evita tener que tomar todos los documentos de una colección y tener que encontrar el valor máximo de alguna identificación.

1

Cualquier cosa que cree una tecla de incremento no funcionará una vez que comience a usar la replicación. Estoy usando algo, genero un prefijo SHA único, como lo hace git. No le da una clave entera, pero podría modificarse fácilmente a. Tampoco se garantiza que sea único, pero tiene mucho menos posibilidades de una colisión que con una tecla de incremento. Tengo la siguiente cosas en mi modelo:

before_create :set_short_id 

def set_short_id 
    prefix_length = 5 
    sha = Digest::SHA1.hexdigest(self.to_json) 
    short_id = nil 
    while short_id.nil? || Ticket.first(:short_id => short_id) 
    short_id = sha.first(prefix_length) 
    prefix_length += 1 
    end 
    self.short_id = short_id 
end 

def to_param 
    short_id 
end 

Lo que significa que las URL de mi aspecto myawesomeblog.com/posts/47cc6 que es un poco mejor.

+0

Sólo por curiosidad ... Entonces, ¿cómo funcionan los identificadores de autoincrement de MySQL en la replicación? – concept47

+0

Creo que MySQL es mucho más agresivo con la replicación. Mongo trabaja en un modelo "eventualmente consistente". No he analizado esto con mucha profundidad, pero hay una serie de screencasts en la replicación de Mongo que pueden arrojar más luz sobre el tema. – Emily

Cuestiones relacionadas