Como serializar MongoDb ObjectId (“uniqueid”) para JSON em nodejs?
Vamos supor que temos um serviço de construtor de consulta B que gera uma consulta mongo db quando chamado. Esta consulta é recebida pelo serviço A e a executa como está com o driver nodejs oficial mongo db.
Como faço para enviar algo como:
[{
_id: new mongo.ObjectID("5f3258cfbaaccedaa5dd2d96"),
phone: "666"
}, {
_id: new mongo.ObjectID("5f3258cfbaaccedaa5dd2da2"),
phone: "555"
}]
do serviço B para o serviço A?
EDITAR:
O seguinte funciona perfeitamente bem:
var q = { _id: new mongo.ObjectID("5f3258cfbaaccedaa5dd2d96") };
const result = await this.db.collection("persons").find(q).toArray();
O seguinte não funciona:
var q = { _id: { $oid: "5f3258cfbaaccedaa5dd2d96" } }
const result = await this.db.collection("persons").find(q).toArray();
Agora,
var q = { _id: new mongo.ObjectID("5f3258cfbaaccedaa5dd2d96") };
JSON.stringify(q)
dá a você: {"_id":"5f3258cfbaaccedaa5dd2d96"}e se você passar isso para o serviço A. Você não pode usá-lo no serviço A da seguinte forma:
const result = await this.db.collection("persons").find(qStr).toArray();
Ou como,
const result = await this.db.collection("persons").find(JSON.parse(qStr)).toArray();
Respostas
Você precisa:
- Serialize seus documentos para json estendido em uma extremidade
- Desserialize seus documentos de json estendido para estruturas de dados nativas da linguagem na outra extremidade
Vejo https://github.com/mongodb/js-bson#node-no-bundling para saber como serializar e desserializar.
Você não pode alimentar hashes anotados do tipo json estendido para funções de driver que esperam tipos nativos (que são todos eles, basicamente, diferentes daquele que analisa especificamente json estendido), como você tentou fazer.
var q = { _id: new mongo.ObjectID("5f3258cfbaaccedaa5dd2d96") };
const serializedQ = BSON.serialize(q);
const deserializedQ = BSON.deserialize(serializedQ);
const result = await this.db.collection("persons").find(deserializedQ).toArray();
Há um padrão que o MongoDB chama de " JSON estendido " que define como você pode codificar todos os tipos de dados BSON em JSON regular.
Vai se tornar algo como
{ _id : {$oid: "5f3258cfbaaccedaa5dd2d96"} }
A maioria das ferramentas do MongoDB será capaz de converter de e para esse formato.