为何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
相关产品推荐
相关产品推荐

