mongodb - tutorial - Mongo clasificación compleja?
mongodb university (3)
¿Por qué no crear el campo con esta operación y ordenarlo?
Sé cómo ordenar las consultas en MongoDB por múltiples campos, por ejemplo, db.coll.find().sort({a:1,b:-1})
.
¿Puedo ordenar con una función definida por el usuario; por ejemplo, suponiendo que a y b son números enteros, ¿por la diferencia entre a y b (ab)
?
¡Gracias!
Se metió en esto y esto es lo que se me ocurrió:
db.collection.aggregate([
{
$project: {
difference: { $subtract: ["$a", "$b"] }
// Add other keys in here as necessary
}
},
{
$sort: { difference: -1 }
}
])
ACTUALIZACIÓN: esta respuesta parece estar desactualizada; parece que la clasificación personalizada se puede lograr más o menos utilizando la función $project
de la canalización de agregación para transformar los documentos de entrada antes de la clasificación. Ver también la respuesta de @Ari.
No creo que esto sea posible directamente; la documentación de clasificación ciertamente no menciona ninguna forma de proporcionar una función de comparación personalizada.
Probablemente sea mejor que haga la clasificación en el cliente, pero si está realmente decidido a hacerlo en el servidor, es posible que pueda usar db.eval()
para organizar la ejecución en el servidor (si su cliente lo admite).
Tipo de servidor:
db.eval(function() {
return db.scratch.find().toArray().sort(function(doc1, doc2) {
return doc1.a - doc2.a
})
});
Frente al tipo de cliente equivalente:
db.scratch.find().toArray().sort(function(doc1, doc2) {
return doc1.a - doc2.b
});
Tenga en cuenta que también es posible ordenar a través de una canalización de agregación y por el operador $orderby
(es decir, además de .sort()
); sin embargo, ninguna de estas formas le permite proporcionar una función de clasificación personalizada.