You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何MongoDB文档生成时会出现相同nanoid与创建日期?

MongoDB Schema 固定默认值问题原因解析

错误写法的问题逻辑

当你在Schema配置中直接写default: nanoid()、default: Date.now()时:

  • JavaScript代码在加载Schema定义文件的阶段就会立刻执行这两个函数,将返回的固定结果(固定的nanoid字符串、Schema加载那一刻的时间戳)作为default属性的静态值
  • Mongoose后续创建新文档时,只会读取这个已经固化的静态值赋值给对应字段,所以所有生成的文档都会拿到完全相同的id和创建日期

正确写法的运行逻辑

当你把() => nanoid()、() => Date.now()这类匿名函数本身作为default属性的值时:

  • JavaScript加载Schema阶段只会把函数定义存储下来,不会立刻执行函数内部的逻辑
  • Mongoose内置了对default字段的特殊处理规则:如果default字段的值是可调用的函数,每次创建新文档时都会主动调用一次该函数,将实时返回的结果作为字段默认值。因此每次创建文档都会生成新的随机id、拿到当前最新的时间戳,各个文档的字段值自然不会重复

你感知到的该问题和JS值与引用的差异有关的直觉是正确的:直接写函数调用相当于给default传入了基本类型的静态值,而传入函数相当于传入了函数对象的引用,Mongoose可以通过该引用反复调用生成新的动态值。

补充:由于Date.now本身就是原生函数,你也可以直接简写为default: Date.now,无需额外包裹箭头函数,运行效果完全一致。

内容的提问来源于stack exchange,提问作者Nikibiki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 13:57:04