create - mongodb replication
Clasificación MongoDB (4)
Quiero implementar una característica de "golpe" para los temas. Una vez que se golpea un tema, tendrá un nuevo campo "bump_date". Quiero ordenarlo para que cuando haya un campo "bump_date", se clasifique como si fuera el campo "created". Aquí hay un ejemplo de mi db.topics:
{
"text" : "test 1",
"created" : "Sun Nov 20 2011 02:03:28 GMT-0800 (PST)"
},
{
"text" : "test 2",
"created" : "Sun Nov 18 2011 02:03:28 GMT-0800 (PST)"
},
{
"text" : "test 3",
"created" : "Sun Nov 17 2011 02:03:28 GMT-0800 (PST)",
"bump_date: : "Sun Nov 19 2011 02:03:28 GMT-0800 (PST)"
}
Quiero que el género regrese en el orden de "prueba 1", "prueba 3", "prueba 2"
Actualmente no es posible en mongodb hacer una clasificación basada en los criterios definidos por el usuario en varias columnas.eg. aquí la función habría sido devolver bump_date
si está configurada, de lo contrario volverá a created
O tendrá que usar un código del lado del servidor o del lado del cliente como se menciona aquí:
o si desea permanecer con la búsqueda y clasificación básica, deberá:
crear una clave
bump_date
equivalente acreated
siempre que secreated
un nuevo registro. Esto no será una sobrecarga de datos, ya que puede esperar que cada tema suyo sea interceptado de vez en cuando en el futuro, porbump_date
tanto, eventualmente se agregará el campobump_date
. Así que agrégalo desde el inicio mismo.Siempre que se
bump_date
el artículo, actualice el campobump_date
.
Sus documentos de ejemplo se verán así con este cambio:
{
"text" : "test 1",
"created" : "Sun Nov 20 2011 02:03:28 GMT-0800 (PST)",
"bump_date" : "Sun Nov 20 2011 02:03:28 GMT-0800 (PST)"
},
{
"text" : "test 2",
"created" : "Sun Nov 18 2011 02:03:28 GMT-0800 (PST)",
"bump_date" : "Sun Nov 18 2011 02:03:28 GMT-0800 (PST)"
},
{
"text" : "test 3",
"created" : "Sun Nov 17 2011 02:03:28 GMT-0800 (PST)",
"bump_date: : "Sun Nov 19 2011 02:03:28 GMT-0800 (PST)"
}
Deberá ensureIndex
el índice en el campo bump_date. Ahora puede consultar los datos requeridos fácilmente.
db.topics.find().sort({ bump_date: 1 })
Como sugirió Brian Hicks, la creación de un campo updated_at adicional es el camino a seguir. De esta manera, cuando se crea un documento, puede haber creado_at y actualizado_al principio ser el mismo.
{
"created_at": xxx,
"updated_at": xxx
}
Si luego "topa" con el campo updated_at ajustándolo a la hora actual cuando hay un evento bump, puede ordenar en el campo updated_at para lograr el orden que desea.
La ordenación en MongoDB se hace así:
db.collection.find({ ... spec ... }).sort({ key: 1 })
donde 1
está ascendiendo y -1
está descendiendo.
En su ejemplo específico: db.topics.find().sort({ bump_date: 1 })
, aunque podría ser mejor llamarlo algo así como "updated_at".
También querrás poner un índice en tu campo "bump_date".
También:
db.collection.find( { $query: {}, $orderby: { column : -1 } } )
donde 1 está ascendiendo y -1 está descendiendo.