利用 Mongoose 自定义 ID 解析:如何生成自定义主键

阅读时长 4 分钟读完

在某些应用程序中,MongoDB 的自动生成 _id 可能不能满足需求,可能需要开发人员自己生成主键。Mongoose 提供了一种方法来使用自定义 ID,这里将介绍如何利用 Mongoose 自定义 ID,包括生成自定义主键和实现自定义主键的解析。

生成自定义主键

自定义生成主键需要向 MongoDB 发送一个 insert 命令,Mongoose 方便开发人员自定义 ID 的方法就是通过执行 pre hook,在保存模型实例之前修改 _id 属性。下面提供了一种用随机数生成自定义 ID 的示例代码:

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

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

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

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

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

实现自定义主键的解析

生成自定义主键后,Mongoose 默认不知道要使用哪个方法来解析它,需要手动告诉 Mongoose 解析方法。下面提供了一种用随机数生成自定义 ID 并实现解析的示例代码:

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

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

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

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

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

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

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

在这个示例代码中,我们添加了一个 findById 静态方法来解析自定义 ID,用类似 find 的方式调用。执行 CustomId.findById(newCustomId._id, callback) 内部实际上是调用了 this.findOne({ _id: id }, callback) , 这里的 id 参数就是传入的随机生成的自定义 ID。

总结

在应用程序中,MongoDB 的自动生成 _id 不一定满足需求,如有需要,可以通过 Mongoose 提供的 pre hook 方法来实现自定义 ID。示例代码演示了生成自定义主键和提供解析方法的步骤。此外,还可以根据应用的实际需求,在 pre hook 中实现更加丰富的主键生成方法,如引用其他字段、将时间戳转换为字符串等。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/652bba127d4982a6ebd991f4

纠错
反馈