Mongo clasificación compleja?

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!

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.

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 } } ]) 

¿Por qué no crear el campo con esta operación y ordenarlo?