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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 07:33:09