auto increment - new - ¿Debería implementar el autoincremento en MongoDB?
mongodb object id long (5)
Estoy haciendo el cambio a MongoDB desde MySQL. Una arquitectura familiar para mí para una tabla de users
muy básica tendría un incremento automático del uid
. Consulte la documentación de Mongo para este caso de uso .
Me pregunto si esta es la mejor decisión arquitectónica. Desde el punto de vista de UX, me gusta tener UID como referencias externas, por ejemplo, en URL más cortas: http://example.com/users/12345
Hay una tercera forma? Alguien en #mongodb
IRC Freenode sugirió crear un rango de ID y almacenarlos en caché. No estoy seguro de cómo implementarlo realmente, o si hay otra ruta que pueda seguir. Ni siquiera necesito necesariamente que el _id
mismo se incremente de esta manera. Siempre que todos los users
tengan un uid
numérico único dentro del documento, me alegraré.
El Mongo ObjectId predeterminado, el que se usa en el campo _id, se está incrementando.
Mongo usa una marca de tiempo (segundos desde la época de Unix) como la primera porción de 4 bytes de su composición 4-3-2-3, muy similar (si no exactamente) a la misma composición que un UUID de la Versión 1. Y ese ObjectId se genera en el momento de la inserción (si el usuario / cliente no proporciona ningún otro tipo de _id)
Por lo tanto, el ObjectId es de naturaleza ordinal; Además, la clasificación predeterminada se basa en esta marca de tiempo creciente.
Se podría considerar una versión actualizada de los identificadores de autoincremento (índice ++) usados en muchos archivos dbms.
Entonces, hay un problema fundamental con los ID de "autoincremento". Cuando tienes 10 servidores diferentes ( fragmentos en MongoDB), ¿quién elige la siguiente ID?
Si desea un único conjunto de ID autoincrementables, debe tener una sola autoridad para elegir esos ID. En MySQL, esto es generalmente bastante fácil ya que solo tiene un servidor que acepta escrituras. Pero las grandes implementaciones de MongoDB están ejecutando sharding que no tiene esta "autoridad central".
MongoDB utiliza ObjectIds
12 bytes para que cada servidor pueda crear nuevos documentos de manera única sin depender de una sola autoridad.
Así que aquí está la gran pregunta: "¿puedes permitirte tener una sola autoridad" ?
Si es así, entonces puede usar findAndModify
para realizar un seguimiento de la "última identificación más alta" y luego puede insertar con eso.
Ese es el proceso descrito en su enlace. La debilidad obvia aquí es que técnicamente tiene que hacer dos escrituras para cada inserción. Es posible que esto no se escale muy bien, es probable que desee evitarlo en datos con una tasa de inserción alta. Puede funcionar para los usuarios, probablemente no funcionará para rastrear clics.
Estoy totalmente en desacuerdo con el autor de la respuesta seleccionada que dice No auto-increment id en MongoDB y hay buenas razones . No sabemos las razones por las cuales 10gen no fomentó el uso de ID autoincrementadas. Es especulación. Creo que 10gen hizo esta elección porque es más fácil garantizar la exclusividad de los ID de 12 bytes en el entorno agrupado. Es la solución predeterminada que se adapta a la mayoría de los recién llegados, por lo tanto, aumenta la adopción de productos, lo que es bueno para el negocio de 10gen.
Ahora permítanme contarles a todos sobre mi experiencia con ObjectIds en el entorno comercial.
Estoy construyendo una red social. Tenemos aproximadamente 6 millones de usuarios y cada usuario tiene aproximadamente 20 amigos.
Ahora imagina que tenemos una colección que almacena la relación entre los usuarios (quién sigue a quién). Se parece a esto
_id : ObjectId
user_id : ObjectId
followee_id : ObjectId
en el cual tenemos un índice compuesto único {user_id, followee_id}
. Podemos estimar que el tamaño de este índice es 12 * 2 * 6M * 20 = 2GB. Ahora ese es el índice de búsqueda rápida de las personas que sigo. Para una búsqueda rápida de las personas que me siguen, necesito un índice inverso. Eso es otro 2GB.
Y esto es sólo el principio. Tengo que llevar estas identificaciones a todas partes. Tenemos un cluster de actividad donde almacenamos su News Feed. Ese es cada evento que tú o tus amigos hacen. Imagina cuánto espacio se necesita.
Finalmente, uno de nuestros ingenieros tomó una decisión inconsciente y decidió almacenar referencias como cadenas que representan ObjectId, que duplica su tamaño.
¿Qué sucede si un índice no cabe en la memoria RAM? Nada bueno, dice 10gen:
Cuando un índice es demasiado grande para caber en la RAM, MongoDB debe leer el índice del disco, que es una operación mucho más lenta que la lectura desde la RAM. Tenga en cuenta que un índice se ajusta a la RAM cuando su servidor tiene RAM disponible para el índice combinado con el resto del conjunto de trabajo.
Eso significa que las lecturas son lentas. La contención de bloqueo aumenta. Las escrituras se vuelven más lentas también. Ver la contención de bloqueo en un 80%, el "fin" ya no me sorprende.
Antes de que te des cuenta, terminaste con un clúster de 460GB que debes dividir en fragmentos y que es bastante difícil de manipular.
Facebook usa 64 bits de largo como id de usuario :) Hay una razón para eso. Puede generar identificadores secuenciales
- usando el consejo de 10gen .
- usando mysql como almacenamiento de contadores (si le preocupa la velocidad, eche un vistazo a handlersocket )
- usando el servicio de generación de ID que construiste o usaste algo como Snowflake de Twitter.
Así que aquí está mi consejo general para todos. Por favor, haga que sus datos sean lo más pequeños posible. Cuando crezcas te ahorrará muchas noches de insomnio.
Josh, no hay identificación de auto incremento en MongoDB y hay buenas razones. Yo diría que vaya con ObjectIds que son únicos en el clúster.
Puede agregar incrementos automáticos mediante una colección de secuencias y utilizando findAndModify para obtener el siguiente ID. Esto definitivamente agregará complejidades a su aplicación y también puede afectar la capacidad de fragmentar su base de datos.
Siempre que pueda garantizar que sus identificadores generados serán únicos, estará bien. Pero el dolor de cabeza estará allí.
Puede consultar esta publicación para obtener más información sobre esta pregunta en el grupo dedicado de google para MongoDB:
Espero que esto ayude.
Gracias
No hay nada como un autoincremento en MongoDB pero puede almacenar sus propios contadores en una colección dedicada y $ inc el valor relacionado del contador según sea necesario. Como $ inc es una operación atómica, no verá duplicados.