Come serializzare MongoDb ObjectId ("uniqueid") in JSON in nodejs?

Aug 28 2020

Supponiamo di avere un servizio di creazione di query B che emette query mongo db quando viene chiamato. Questa query viene ricevuta dal servizio A e la esegue così com'è con il driver nodejs ufficiale di mongo db.

Come invio qualcosa come:

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

dal servizio B al servizio A?

MODIFICARE:

Quanto segue funziona perfettamente bene:

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

Quanto segue non funziona:

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

Adesso,

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

ti dà: {"_id":"5f3258cfbaaccedaa5dd2d96"}e se lo passi al servizio A. Non puoi usarlo nel servizio A come segue:

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

O come,

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

Risposte

D.SM Aug 28 2020 at 22:51

Devi:

  • Serializza i tuoi documenti in json esteso su un'estremità
  • Deserializza i tuoi documenti da JSON esteso a strutture di dati native della lingua dall'altra parte

Vedere https://github.com/mongodb/js-bson#node-no-bundling per come serializzare e deserializzare.

Non è possibile fornire hash annotati di tipo json estesi a funzioni del driver che si aspettano tipi nativi (che sono tutti, fondamentalmente, diversi da quello che analizza specificamente json esteso), come hai cercato di fare.

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

Esiste uno standard che MongoDB chiama " JSON esteso " che definisce come codificare tutti i tipi di dati BSON nel normale JSON.

Diventerà qualcosa di simile

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

La maggior parte degli strumenti MongoDB sarà in grado di convertire in e da quel formato.