在NestJS中为MongoDB数组无_id的文档添加ObjectID遇阻求助
问题分析与修正方案
代码中的核心错误点
过滤条件语法错误
你写的{ $stipulations: [] }是错误语法,MongoDB字段名不需要加$前缀。如果要定位数组中存在无_id对象的文档,正确过滤条件应为{ 'stipulations._id': { $exists: false } };若要匹配所有包含stipulations数组的文档,可写{ stipulations: { $exists: true, $ne: [] } }。更新字段名错误
$set内的字段写成了$stipulations,这里不需要加$,直接写字段名stipulations即可,$仅用于MongoDB的操作符前缀。ObjectId构造方式错误
在MongoDB的JS函数环境中,不能直接用new ObjectId(),必须通过全局Mongo对象调用,即new Mongo.ObjectId(),否则会抛出构造函数未定义的错误。Repository方法缺少返回值
你的updateMany方法没有返回this.model.updateMany的执行结果,导致await无法获取操作状态,需要添加return关键字。
修正后的完整代码
Repository方法修正
public async updateMany(filter: FilterQuery<T>, doc: UpdateQuery<T>) { return this.model.updateMany(filter, doc, { upsert: true, multi: true }); }
更新查询修正
const temp = await this.vehiclesRepository.updateMany( // 匹配数组中存在无_id对象的文档 { 'stipulations._id': { $exists: false } }, { $set: { stipulations: { $function: { body: function(ar) { return ar.map(x => { if (x.hasOwnProperty('_id')) { return x; } else { x._id = new Mongo.ObjectId(); return x; } }); }, args: ['$stipulations'], lang: 'js' } } } } );
额外注意事项
- 确保你的MongoDB版本在4.4及以上,
$function操作符仅在该版本及之后支持;若版本较低,需改用先查询文档、在代码中处理数组后再批量更新的方式。 - 如果需要强制更新所有包含
stipulations数组的文档(无论数组内是否已有_id),可将过滤条件替换为{ stipulations: { $exists: true, $ne: [] } }。
内容的提问来源于stack exchange,提问作者BeepJared
相关产品推荐
相关产品推荐

