NestJS MongoDB切换Todo状态时日期转换失败问题求助
问题解决:MongoDB日期转换失败错误
错误原因
当传入status为true时,你在$set中试图用字符串'todos.$[todo].createdAt'保留原createdAt值,但MongoDB会将这个字符串当作要设置的实际值,而createdAt字段在Schema中定义为Date类型,无法将该字符串转换为合法日期,因此抛出Cast to date failed错误。
解决方案
动态构建更新对象:根据status的值决定是否在$set中包含createdAt字段。当status为true时,仅更新isCompleted;当status为false时,同时更新isCompleted和createdAt为新日期。
修改后的代码
//toggle todo as completed true or false async toggleTodo( userId: string, data: ToggleTodoDto, ): Promise<{ todo: TodoEntity; message: string }> { try { const { childTodoId, todoId, status } = data; // 动态构建更新字段 const updateFields: Record<string, any> = { 'todos.$[todo].isCompleted': status, }; // 仅当status为false时,添加createdAt更新 if (!status) { updateFields['todos.$[todo].createdAt'] = new Date(); } const todo = await this.todoModel .findOneAndUpdate( { _id: new ObjectId(todoId), userId: new ObjectId(userId), }, { $set: updateFields }, { arrayFilters: [{ 'todo._id': new ObjectId(childTodoId) }], new: true, }, ) .exec(); if (!todo) throw new NotFoundException('To-Do not found'); return { todo, message: 'To-Do toggled successfully', }; } catch (error) { if (error instanceof NotFoundException) throw new NotFoundException(error.message); throw new InternalServerErrorException(error.message); } }
额外提示
你的SingleTodoEntity中createdAt的默认值设置存在问题:
@Prop({ type: Date, default: Date })
这里default: Date会将构造函数本身作为默认值,而非当前日期。建议改为:
@Prop({ type: Date, default: Date.now })
内容的提问来源于stack exchange,提问作者zackOverflow
相关产品推荐
相关产品推荐

