2011-11-21 10 views
27

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". He aquí un ejemplo de mis db.topics:ordenación de MongoDB

{ 
    "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 el tipo de volver en el orden de "prueba 1", "prueba de 3", "prueba 2"

+0

Podría ser útil para la clasificación de MongoDB http://www.code-sample.com/2016/07/mongodb-sort-by-date.html –

Respuesta

69

selección MongoDB como se hace por lo que:

db.collection.find({ ... spec ... }).sort({ key: 1 })

donde 1 es ascendente y -1 es descendente.

En su ejemplo específico: db.topics.find().sort({ bump_date: 1 }), aunque podría ser mejor llamarlo algo así como "updated_at".

Definitivamente también querrá poner un índice en su campo "bump_date".

+2

Para que esto funcione como se esperaba, creo que OP tendrá que establecer ' bump_date' a 'created' al guardar el documento por primera vez. Luego, siempre ordena por 'bump_date' e index como lo sugiere. – dcrosta

+1

Es cierto, y probablemente debería crearse para que la colección pueda compactarse finalmente. O bien, [índices dispersos] (http://www.mongodb.org/display/DOCS/Indexes#Indexes-SparseIndexes). –

2

Actualmente no es posible en mongodb hacer una especie en base a criterios definidos por el usuario más columns.eg múltiple. aquí la función habría sido volver bump_date si se establece o regrese created

O se tendrá que utilizar un servidor o código del lado del cliente como se ha mencionado aquí:

Mongo complex sorting?

o si desea quedarse con quering básica y clasificación, deberá:

  • crear una clave equivalente a bump_datecreated cada vez que se crea un nuevo registro. Esto hará que no sea una sobrecarga de datos, ya que puede esperar que cada tema suyo sea interceptado de vez en cuando en el futuro, por lo tanto, eventualmente se agregará el campo bump_date. Así que agrégalo desde el inicio mismo.

  • Siempre que se golpee el artículo, actualice el campo bump_date.

Sus documentos de ejemplo se vería 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)" 
} 

Usted deberá ensureIndex en el campo bump_date. Ahora puede consultar los datos requeridos fácilmente.

db.topics.find().sort({ bump_date: 1 }) 
+0

por qué se debe aplicar ensureIndex a bump_date? –

5

Como sugirió Brian Hicks, creando 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 a continuación "reactivar" el campo updated_at estableciéndolo en la hora actual cuando hay un evento de un bache puede ordenar en el campo updated_at para lograr el orden que desee.

4

También:

db.collection.find({ $query: {}, $orderby: { column : -1 } }) 

donde 1 es ascendente y -1 es descendente.