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 对象时没有启动某种验证,只有在迁移它们时才启动。
我刚刚将我的 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 对象时没有启动某种验证,只有在迁移它们时才启动。