Estoy usando MongoDB como mi base de datos.
Tengo datos que contienen rango y nombre como columnas. Ahora se puede actualizar una nueva fila con un rango diferente de los rangos ya existentes o puede ser el mismo.
Si es igual, se deben ajustar los rangos de otras filas.
Las filas que tienen un rango menor que el que se va a insertar deben incrementarse en uno y las filas que tienen rangos pueden permanecer como este.
La característica es algo así como una lista con viñetas de números en el tipo de aplicaciones de MS Word. Cuando inserte una fila en el medio, ajuste la numeración de otras filas debajo de ella.
El rango 1 es el rango más alto.
Por ejemplo, hay 3 filas
Name Rank A 1 B 2 C 3Ahora quiero actualizar una fila con D como nombre y 2 como rango. Así que ahora, después de la inserción de la fila, la base de datos debería gustar a continuación
Name Rank A 1 B 3 C 4 D 2Probablemente usando activadores de base de datos puedo lograr esto actualizando las otras filas.
Tengo un par de preguntas
(a) ¿Hay alguna otra manera mejor que usar el activador de la base de datos para lograr este tipo de escenario? Actualizar todas las filas puede ser un trabajo lento.
(b) ¿La base de datos compatible con MongoDB se activa de forma nativa?
Saludos,
Saurav
No, MongoDB no proporciona disparadores (todavía). Además, no creo que el disparador sea realmente una excelente manera de lograr esto.
Así que me gustaría lanzar algunas ideas, ver si tiene sentido.
Enfoque 1
Tal vez en lugar de perturbar tantos documentos, puede crear una colección con un solo documento (llamemos clasificación de la colección). En ese documento, tenga un rango de llamada de campo de matriz. Como es una matriz, ya está manteniendo una secuencia.
{ _id : "RANK", "ranks" : ["A","B","C"] }Ahora, si desea agregar D a este rango en la segunda posición
db.ranking.update({_id:"RANK"},{$push : {"ranks":{$each : ["D"],$position:1}}});agregaría D al índice 1, que es la segunda posición considerando que el índice comienza en 0.
{ _id : "RANK", "ranks" : ["A","D","B","C"] }Pero hay un problema, ¿qué sucede si desea cambiar la posición C a la 1ra desde la 4ta, debe eliminarla del final y colocarla al principio, estoy seguro de que ambas operaciones no se pueden lograr en una sola actualización (no cavar mucho en las opciones), por lo que podemos ejecutar dos consultas
db.ranking.update({_id:"RANK"},{$pull : {"ranks": "C"}}); db.ranking.update({_id:"RANK"},{$push : {"ranks":{$each : ["C"],$position:0}}});Entonces sería como { _id : "RANK", "ranks" : ["C","A","D","B"] }
manteniendo el resto de la secuencia.
Ahora probablemente desee almacenar la identificación en lugar de A, B, C, etc. Un documento puede tener 16 MB, por lo que, básicamente, esta matriz de rangos puede almacenar más de 1,3 millones de entradas de identificación, si la identificación es MongoDB ObjectId de 12 bytes cada una. si eso no es suficiente, aún tenemos la opción de tener documentos de seguimiento con mayor clasificación.
Enfoque 2
también puede, en lugar de tener rango como número, solo tener dos campos como seguido por y precedido por.
por lo que su documento de usuario se vería
{ _id:"A" "followedBy":"B", } { _id:"B" "followedBy":"C", "precededBy":"A" } { _id:"c" "precededBy":"B", }si desea agregar D en la segunda posición, entonces debe cambiar la segunda posición actual y debe insertar la nueva, por lo que sería un cambio en solo dos documentos
{ _id:"A" "followedBy":"B", } { _id:"B" "followedBy":"C", "precededBy":"D" //changed from A to D } { _id:"c" "precededBy":"B", } { _id:"D" "followedBy":"B", "precededBy":"A" }La desventaja de este enfoque es que no puede ordenar la consulta en función de la clasificación hasta que obtenga todos estos en la aplicación y cree una especie de estructura de lista vinculada.
Este enfoque solo conserva la clasificación con cambios mínimos en la base de datos.