MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Serializando o retorno de find() do MongoDB em uma matriz JSON não anônima, usando o PyMongo


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.