Как сериализовать MongoDb ObjectId («uniqueid») в JSON в nodejs?

Aug 28 2020

Предположим, у нас есть служба B построителя запросов, которая при вызове выдает запрос mongo db. Этот запрос получает служба A и выполняет его как есть с официальным драйвером nodejs mongo db.

Как отправить что-то вроде:

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

из службы B в службу A?

РЕДАКТИРОВАТЬ:

Следующее работает отлично:

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

Следующее не работает:

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

В настоящее время,

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

дает вам: {"_id":"5f3258cfbaaccedaa5dd2d96"}и если вы передадите это службе A. Вы не можете использовать ее в службе A следующим образом:

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

Или как,

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

Ответы

D.SM Aug 28 2020 at 22:51

Вам нужно:

  • Сериализуйте свои документы в расширенный json на одном конце
  • Десериализуйте свои документы из расширенного json в языковые структуры данных на другом конце

Видеть https://github.com/mongodb/js-bson#node-no-bundling о том, как сериализовать и десериализовать.

Вы не можете передавать расширенные аннотированные хэши json-типа в функции драйвера, которые ожидают нативных типов (которые, по сути, все они, кроме того, который специально анализирует расширенный json), как вы пытались это сделать.

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

Существует стандарт, который MongoDB называет « расширенным JSON », который определяет, как вы можете кодировать все типы данных BSON в обычном JSON.

Это станет чем-то вроде

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

Большинство инструментов MongoDB смогут конвертировать в этот формат и обратно.