Jak serializować MongoDb ObjectId („uniqueid”) do JSON w nodejs?

Aug 28 2020

Załóżmy, że mamy usługę B do tworzenia zapytań, która po wywołaniu wyrzuca zapytanie mongo db. To zapytanie jest odbierane przez usługę A i wykonuje je tak samo, jak w przypadku oficjalnego sterownika mongo db nodejs.

Jak wysłać coś takiego:

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

z serwisu B do serwisu A?

EDYTOWAĆ:

Następujące działa doskonale:

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

Poniższe nie działa:

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

Teraz,

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

daje ci: {"_id":"5f3258cfbaaccedaa5dd2d96"}a jeśli przekażesz to do serwisu A. Nie możesz go używać w serwisie A w następujący sposób:

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

Lub jako

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

Odpowiedzi

D.SM Aug 28 2020 at 22:51

Musisz:

  • Serializuj swoje dokumenty do rozszerzonego json na jednym końcu
  • Zdeserializuj swoje dokumenty z rozszerzonych struktur danych json do natywnych dla języka struktur danych na drugim końcu

Widzieć https://github.com/mongodb/js-bson#node-no-bundling jak serializować i deserializować.

Nie można przekazywać rozszerzonych skrótów z adnotacjami typu JSON do funkcji sterownika, które oczekują typów natywnych (które są w zasadzie wszystkimi innymi niż ten, który konkretnie analizuje rozszerzony json), tak jak próbowałeś to zrobić.

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

Istnieje standard nazywany przez MongoDB „ rozszerzonym JSON ”, który definiuje sposób kodowania wszystkich typów danych BSON w zwykłym formacie JSON.

Stanie się czymś podobnym

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

Większość narzędzi MongoDB będzie w stanie konwertować do iz tego formatu.