¿Cómo serializar MongoDb ObjectId ("uniqueid") a JSON en nodejs?

Aug 28 2020

Supongamos que tenemos un servicio B de creación de consultas que escupe una consulta mongo db cuando se llama. Esta consulta es recibida por el servicio A y la ejecuta tal cual con el controlador oficial nodejs de mongo db.

¿Cómo envío algo como:

[{
  _id: new mongo.ObjectID("5f3258cfbaaccedaa5dd2d96"),
  phone: "666"
}, {
  _id: new mongo.ObjectID("5f3258cfbaaccedaa5dd2da2"),
  phone: "555"
}]

del servicio B al servicio A?

EDITAR:

Lo siguiente funciona perfectamente bien:

var q = { _id: new mongo.ObjectID("5f3258cfbaaccedaa5dd2d96") };
const result = await this.db.collection("persons").find(q).toArray();

Lo siguiente no funciona:

var q = { _id: { $oid: "5f3258cfbaaccedaa5dd2d96" } }
const result = await this.db.collection("persons").find(q).toArray();

Ahora,

var q = { _id: new mongo.ObjectID("5f3258cfbaaccedaa5dd2d96") };
JSON.stringify(q)

le da: {"_id":"5f3258cfbaaccedaa5dd2d96"}y si lo pasa al servicio A. No puede usarlo en el servicio A de la siguiente manera:

  const result = await this.db.collection("persons").find(qStr).toArray();

O como

  const result = await this.db.collection("persons").find(JSON.parse(qStr)).toArray();

Respuestas

D.SM Aug 28 2020 at 22:51

Necesitas:

  • Serialice sus documentos a json extendido en un extremo
  • Deserialice sus documentos desde json extendido hasta estructuras de datos nativas del idioma en el otro extremo

Ver https://github.com/mongodb/js-bson#node-no-bundling para saber cómo serializar y deserializar.

No puede alimentar hashes anotados de tipo json extendidos a las funciones del controlador que esperan tipos nativos (que son todos, básicamente, distintos del que analiza específicamente json extendido), como intentó hacer.

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();
Thilo Aug 28 2020 at 19:40

Existe un estándar que MongoDB llama " JSON extendido " que define cómo se pueden codificar todos los tipos de datos BSON en JSON normal.

Se convertirá en algo como

{ _id : {$oid: "5f3258cfbaaccedaa5dd2d96"} }

La mayoría de las herramientas de MongoDB podrán convertir desde y hacia ese formato.