【问题标题】:How serialize MongoDb ObjectId("uniqueid") to JSON in nodejs?如何在nodejs中将MongoDb ObjectId(“uniqueid”)序列化为JSON?
【发布时间】:2020-08-28 12:22:14
【问题描述】:

假设我们有一个查询构建器服务 B,它在调用时会输出 mongo db 查询。此查询由服务 A 接收,并按原样使用 mongo db 官方 nodejs 驱动程序执行。

我如何发送类似的东西:

[{
  _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();

【问题讨论】:

  • 使用var q = { _id: new mongo.ObjectID("5f3258cfbaaccedaa5dd2d96") }; const result = await this.db.collection("persons").find(q).toArray();有什么问题?
  • 完全没有问题。它在服务 B 中运行良好。但问题是如何将其发送到服务 A 并在服务 A 中执行? @whoami
  • 是的,我的意思是当你将它发送到service A 时发生了什么?

标签: javascript node.js json mongodb mongodb-query


【解决方案1】:

你需要:

  • 将您的文档序列化为一端的扩展 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();

【讨论】:

  • 是的,这正是我所需要的。谢谢。
  • 不过我有一个问题。 BSON.serialize(q) 没有给你一个字符串。那么是否可以在 HTTP 调用中将其发送到另一个服务?
  • BSON 是一种二进制格式,序列化后应该会得到一个二进制字符串。
【解决方案2】:

有一个标准被 MongoDB 称为“Extended JSON”,它定义了如何在常规 JSON 中编码所有 BSON 数据类型。

会变成这样的

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

大多数 MongoDB 工具都可以转换为该格式。

【讨论】:

  • 我也是这么想的。但以下查询无法执行:const result = await this.db.collection("persons").bulkWrite([{ _id: {"$oid":"5f3258cfbaaccedaa5dd2d96"} , phone: "666" } , { _id: {"$oid":"5d505646cf6d4fe581014ab2"} , phone: "555" }].map(function (p) { return { updateOne: { filter: { _id: p._id }, update: { $set: { phone: p.phone } } } } }))
  • 如果您的意思是将{ _id : {$oid: "5f3258cfbaaccedaa5dd2d96"} } 转换为new mongo.ObjectID("5f3258cfbaaccedaa5dd2d96"),有没有一种编程方式可以做到这一点?喜欢BSON.parse({$oid: "5f3258cfbaaccedaa5dd2d96"})
  • 如何将[{"_id":"5f3258cfbaaccedaa5dd2d96","phone":"666"},{"_id":"5f3258cfbaaccedaa5dd2da2","phone":"555"}]; 转换为{ _id: new mongo.ObjectID("5f3258cfbaaccedaa5dd2d96"), phone: "232" } 反之亦然?
  • @SamuraiJack:这个答案没问题!因此,假设数据以JSON 特定JSON string 的形式在两个系统之间传输,因为ObjectId() 不是JSON 类型,这个查询可以转换为JSON 字符串传输到其他服务,它可以是JSON.parse() 和在 DB 上执行,我相信 DB 会将 string 转换为 ObjectId() 但如果您希望在代码中进行此转换,则 service B 将执行 new mongo.ObjectID("") 但在传输中 ObjectId() 将转换为 string ,再次在service A 需要将字符串转换为objectId
  • @whoami 请查看我的编辑。我试图解释自己。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-17
  • 2020-06-01
  • 1970-01-01
  • 2014-01-31
  • 2019-07-17
相关资源
最近更新 更多