Как сериализовать MongoDb ObjectId («uniqueid») в JSON в nodejs?
Предположим, у нас есть служба 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();
Ответы
Вам нужно:
- Сериализуйте свои документы в расширенный 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();
Существует стандарт, который MongoDB называет « расширенным JSON », который определяет, как вы можете кодировать все типы данных BSON в обычном JSON.
Это станет чем-то вроде
{ _id : {$oid: "5f3258cfbaaccedaa5dd2d96"} }
Большинство инструментов MongoDB смогут конвертировать в этот формат и обратно.