在 Mongoose 中处理不同类型的数据库 Id

Mongoose 是一个 Node.js 中使用 MongoDB 的优秀对象模型工具,它通过定义 Schema、Model 等不同的方式,使得我们可以在 Node.js 中方便地操作 MongoDB 数据库。在使用 Mongoose 时,我们常常会遇到处理各种不同类型的数据库 ID 的情况,因为 MongoDB 数据库支持多种 ID 的类型,比如 ObjectId、String、Number 等。如何根据不同的 ID 类型合理地对数据进行操作,是建立起一个高效的数据库应用的关键问题。

ObjectId 类型的 ID

ObjectId 是 MongoDB 默认的 ID 类型,它是由 MongoDB 生成的,在数据库中是唯一的。在 Mongoose 中,ObjectId 类型与 String 类型是最常见的 ID 类型。当我们定义一个 Schema 的时候,我们可以通过如下方式来指定 ID 字段使用 ObjectId 类型:

----- -------- - --------------------
----- ------ - ----------------

----- ------------- - --- --------
  ----- -------
  ------ ------
-- -
  ----------- ------
  ----------- -----
  ---- -----
  --- -----
---

----- ------- - ------------------------- ---------------

-------------- - --------

通过上面的代码,我们可以看到,_id 为 true 表示我们在该 Schema 中启用默认的 ObjectId 类型的 ID 设置。这里需要注意的是,如果我们在创建 Schema 时没有进行修改 ID 类型,那么默认情况下,只要我们创建一个新的 Document,就会自动分配一个 ObjectId 类型的 ID。

实际上,在进行查询的时候,我们可以直接使用该 Document 的 ID 字段,而无需使用它的 ObjectId:

----- -- - ---------------------------

----------------------------------- -- -
  ---------------------
-------------- -- -
  -----------------
---

在上面的代码中,我们只需要将 ID 字符串赋给 findById 方法,Mongoose 会自动帮我们转换成 ObjectId 类型,从而去数据库中查询文档。

String 类型的 ID

当我们需要使用自定义的 ID 字段时,我们可以使用 String 类型。在 Mongoose 中,我们可以通过设置 Schema 中的 _id 字段来设置 String 类型的 ID。例如:

----- -------- - --------------------
----- ------ - ----------------

----- ------------- - --- --------
  ---------- -
    ----- -------
    --------- -----
    ------- ----
  --
  ----- -------
  ------ ------
-- -
  ----------- ------
  ----------- -----
  ---- -----
---

----- ------- - ------------------------- ---------------

-------------- - --------

通过上面的代码,我们可以看到,我们将 _id 设置为 false,这就说明该 Schema 不使用默认的 _id 作为 ID 字段,而是使用我们自己定义的 productId 这个字符串类型的字段作为 ID。需要注意的是,由于我们自己定义了 ID 字段,因此它必须是唯一的,我们可以通过 unique 标记来保证其唯一性。

在进行查询时,我们需要将查询条件中的 ID 字段设置为对应的字符串类型:

----- --------- - --------

----------------- ---------- --------- ----------------- -- -
  ---------------------
-------------- -- -
  -----------------
---

通过上面的代码,我们发现,当我们使用 String 类型的 ID 字段时,我们可以像处理普通字段一样处理 ID 字段,这使得代码的可读性更强。

其他 ID 类型

除了 ObjectId 和 String 类型之外,MongoDB 还支持 Number (Legacy) 和 BinData (Binary Data) 类型的 ID。在 Mongoose 中,我们也可以通过设置 ID 类型来处理这些不同的 ID 类型:

----- -------- - --------------------
----- - ------ - - ---------

----- ------------- - --- --------
  ---- -
    ----- -------
    --------- ----
  --
  ----- -------
  ------ ------
-- -
  ----------- ------
  ----------- ----
---

----------------------------- -
  -------- ----
---

----- ------- - ------------------------- ---------------

-------------- - --------

通过上面的代码,我们可以看到,我们使用了 Buffer 类型来表示 ID 字段。需要注意的是,当我们使用 Buffer 类型时,必须保证长度为 12,这是因为 MongoDB 的 ObjectId 格式是由 12 个字节构成。

当我们查询文档时,我们需要将 ID 字段设置为 Buffer 类型:

----- -- - --------------------------------------- -------

----------------------------------- -- -
  ---------------------
-------------- -- -
  -----------------
---

通过上面的代码,我们使用了 Buffer.from 方法将 ID 字符串转换为 Buffer 类型。这使得我们可以自由地使用不同类型的 ID,在使用时只需要保证对应的类型即可。

总结

通过本文的介绍,我们可以看到,在 Mongoose 中处理不同类型的数据库 ID 非常容易。我们只需要在 Schema 中设置对应的 ID 类型,就可以使用不同类型的 ID 进行操作,这样大大提高了代码的可读性和可维护性。

无论使用哪种类型的 ID,我们都应该确保其唯一性,并确保其符合 MongoDB 的要求,这是保证应用程序正常运行的关键。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6646c5b1d3423812e44ec36d