SimpleSchema子文档配置autoValue生成_id时报ID必填错误如何解决
报错原因
- 核心问题1:
autoValue使用箭头函数定义。箭头函数不会绑定自身的this上下文,你预期的SimpleSchema操作上下文没有被正确传入,导致this.docId返回undefined,子文档的_id字段未被赋值,而该字段默认是必填项,因此触发校验失败。 - 问题2:即使把箭头函数换成普通函数,嵌套子文档上下文中的
this.docId指向的是父文档的ID,不是子文档自身的唯一标识,如果你需要每个子文档有独立ID,这个取值逻辑本身就是错误的。 - 场景附加问题:对嵌套数组执行
$push更新时,默认Schema校验只会校验你主动传入的字段,没有触发autoValue的自动生成逻辑也会导致该报错。
解决方案
根据你的实际需求二选一即可:
场景1:需要每个子文档有独立的唯一ID
首先替换autoValue的箭头函数为普通函数,使用Meteor内置的Random.id()生成唯一ID:
// 提前引入meteor内置的Random包 import { Random } from 'meteor/random'; const childSchema = new SimpleSchema({ _id: { type: String, autoValue: function() { // 仅字段未被主动赋值时自动生成 if (!this.isSet) { return Random.id(); } } }, // 其余字段保持原有配置不变 name: String, members: { type: Array, optional: true, }, 'members.$': String, })
如果更新时仍然不触发autoValue,最稳妥的方案是手动给子文档赋值_id:
const child = { _id: Random.id(), name, members, }; ParentCollection.update( { _id: id }, { $push: { children: child } } );
场景2:子文档不需要独立ID
直接把_id字段从子Schema中删除,或者给_id配置optional: true即可跳过该字段的必填校验。
内容的提问来源于stack exchange,提问作者Viswajith Kalavapudi
相关产品推荐
相关产品推荐

