The best way to do this is to use the .aggregate() method and $cond to add weight to your documents in $project , then use $sort sort the documents by weight.
pipeline = [{'$project': {'category': 1, 'name': 1, 'w': {'$cond': [{'$eq': ['$category', 'B']}, 1, {'$cond': [{'$eq': ['$category', 'C']}, 2, 3] }] } }}, {'$sort': {'w': 1}} ] Model.aggregate(*pipeline)
Demo using PyMongo:
>>> import pprint >>> import pymongo >>> client = pymongo.MongoClient() >>> collection = client['test']['collection'] >>> pipeline = [{'$project': {'category': 1, ... 'name': 1, ... 'w': {'$cond': [{'$eq': ['$category', 'B']}, ... 1, ... {'$cond': [{'$eq': ['$category', 'C']}, ... 2, ... 3] ... }] ... } ... }}, ... {'$sort': {'w': 1}} ... ] >>> pprint.pprint(list(collection.aggregate(pipeline=pipeline))) [{'_id': ObjectId('571caa930e4f55302502a361'), 'category': 'B', 'name': '456', 'w': 1}, {'_id': ObjectId('571caa930e4f55302502a363'), 'category': 'C', 'name': '101', 'w': 2}, {'_id': ObjectId('571caa930e4f55302502a360'), 'category': 'A', 'name': '123', 'w': 3}, {'_id': ObjectId('571caa930e4f55302502a362'), 'category': 'A', 'name': '789', 'w': 3}]
source share