rxdb:文档迁移失败最终文档与最终模式不匹配

rxdb: migration of document failed final document does not match final schema

我刚刚将我的 rxdb 模式版本从 0 更改为 1 以添加 deletedAt 属性。我添加了从版本 0 到版本 1 的迁移策略。

现在我收到此错误:“文档迁移失败,最终文档与最终架构不匹配”。 最终文档在下面的屏幕截图中:

我想也许我必须添加 _rev 字段;将 _rev 添加到架构并没有消除错误,因此我已将其撤回。同上 deleted 字段(抱怨我不能将其添加为顶级属性)。所以我不知道为什么最终对象与预期模式不同?

输入信息

export type TodoType = {
  id: string
  text: string
  isCompleted: boolean
  createdAt: string
  updatedAt: string
  deletedAt: string
}
//...
export const todoSchema: RxJsonSchema<TodoType> = {
  title: 'todo schema',
  description: 'todo schema',
  version: 1, // just changed this from 0 to 1
  type: 'object',
  properties: {
    id: {
      type: 'string',
      primary: true
    },
    text: {
      type: 'string'
    },
    isCompleted: {
      type: 'boolean'
    },
    createdAt: {
      type: 'string',
      format: 'date-time',
      // index: true,   
    },
    updatedAt: {
      type: 'string',
      format: 'date-time'
    },
    deletedAt: {
      type: 'string',
      format: 'date-time'
    },
  },
  required: ['id', 'text', 'isCompleted', 'createdAt', 'updatedAt', 'deletedAt'],
  indexes: ['createdAt']
}

迁移器代码

  await myDatabase.collection({
    name: 'todos',
    schema: todoSchema,
    methods: todoMethods,
    statics: todoCollectionMethods,
    migrationStrategies: {
      // 1 means, this transforms data from version 0 to version 1
      1: function(oldDoc: TodoDocument) {
        oldDoc.updatedAt = oldDoc.updatedAt === '' ? oldDoc.createdAt : oldDoc.updatedAt
        oldDoc.deletedAt = oldDoc.deleted ? oldDoc.updatedAt : ''
        return oldDoc;
      }
    }
  })

问题是我刚刚添加的 deletedAt 在 json 架构中是这样定义的:

    deletedAt: {
      type: 'string',
      format: 'date-time'
    },

... 我在创建版本时将值默认为 '' (空字符串) 0 个对象。空字符串对于 json 模式中的 date-time 格式 无效。因此,当对象被迁移到版本 1 时,转换以具有 deletedAt 的对象结束,该对象未通过验证。

解决方案:

  • 更新 rxdb 集合的 json 模式 required: [...]数组。
  • 更改 javascript 对象的任何本地 typescript 类型 以便 deletedAt 是一个 可选 属性或一个默认为空。 This is okay because null is valid date-time format string in json schema.

不确定为什么在保存版本 0 对象时没有启动某种验证,只有在迁移它们时才启动。