O problema aqui é que você já stringificou a resposta como JSON antes de passar isso para outra estrutura de dados (agora como uma string) para retornar isso como JSON. Então você está basicamente fazendo uma codificação dupla e a "string" é codificada.
Então, apenas passe os dados uma vez:
docs = mongodb.find(...query...)
return bson.json_util.dumps({ 'success': True, 'mycollectionKey': docs })
Então, em uma pequena coleção como esta:
{ "_id" : ObjectId("5343aeb5efbdb94c3647c8df"), "field" : "BBB" }
{ "_id" : ObjectId("5343aebbefbdb94c3647c8e0"), "field" : "aaa" }
{ "_id" : ObjectId("5343aebfefbdb94c3647c8e1"), "field" : "AAA" }
Você obtém um resultado como este:
{
"mycollectionKey": [
{"field": "BBB", "_id": {"$oid": "5343aeb5efbdb94c3647c8df"}},
{"field": "aaa", "_id": {"$oid": "5343aebbefbdb94c3647c8e0"}},
{"field": "AAA", "_id": {"$oid": "5343aebfefbdb94c3647c8e1"}}
],
"success": true
}
Se você está realmente preocupado com a ordem dessas duas chaves, pode usar os "dumps" do bson para ir para uma string e decodificar com o decodificador json padrão para obter um dict nativo com os objetos Mongo desserializados e, em seguida, colocar em seu dict ordenado.
Mas realmente seu cliente não deve se preocupar com a ordem das chaves e apenas esperar esses elementos raiz.