MongoDB如何在Node.js中比较ObjectIds

233 阅读1分钟

MongoDB要求每个文档包含一个_id 字段。如果在插入一个文档时,_id 字段不存在,MongoDB会为你生成一个ObjectId

ObjectIds的长度为12字节。4个字节的时间戳,5个字节的随机值,以及3个字节的递增计数器。ObjectId可以被格式化为一个十六进制字符串,看起来像61dc2d31bbe643fc32022a5f

ObjectIds的问题是:你不能将一个ObjectId字符串与一个ObjectId实例进行比较。

本教程告诉你如何在Node.js中比较ObjectIds。

在Node.js中比较MongoDB ObjectIds

当在你的应用程序中使用ObjectIds时,你也可以在前端(浏览器)使用它们。请求给定网页的数据可能使用ObjectId作为给定资源的标识符。在URL中使用标识符需要为请求提供一个字符串表示。在你的后端,你需要将请求参数转换回其原始类型。

让我们想象一下下面的简化代码:你有一个字符串格式的ObjectId和一个使用ObjectId的文档,_id

将字符串ObjectId与用户实例中的_id 字段进行比较,返回false

const oid = '61dc2d31bbe643fc32022a5f'

const user = {  
  _id: ObjectId("61dc2d31bbe643fc32022a5f"),
  name: { first: "Future", last: "Studio" }
}

const isEqual = user._id === oid  
// false

你应该做的是:使用objectId.equals 方法。每个ObjectId实例都支持equals 方法,允许你提供你的比较值。MongoDB Node.js驱动会解析给定的参数值并进行比较:

const oid = '61dc2d31bbe643fc32022a5f'

const user = {  
  _id: ObjectId("61dc2d31bbe643fc32022a5f"),
  name: { first: "Future", last: "Studio" }
}

const isEqual = user._id.equals(oid)  
// true

享受比较MongoDB ObjectIds的乐趣吧