我需要将Azure CosmosDB(以前称为DocumentDB)中的数据移动到Azure SQL数据库中。
我正在使用"复制数据"资源,我设置了源和目标以及映射。
时间表已设置为每小时一次。问题:
活动Copy_dbo_SubscriptionLocator失败:发生了失败 '来源'侧。 错误码= UserErrorDocumentDBReadError,'类型= Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,消息= DocumentDb 操作失败:消息:{"错误":["无效查询已被执行 使用针对未进行范围索引的路径的过滤器指定。 请考虑在请求中添加允许扫描标头。"]}
我需要对CosmosDB进行哪些更改以避免错误?
以下是我目前的索引政策:
{
"indexingMode": "consistent",
"automatic": true,
"includedPaths": [
{
"path": "/*",
"indexes": [
{
"kind": "Range",
"dataType": "Number",
"precision": -1
},
{
"kind": "Hash",
"dataType": "String",
"precision": 3
}
]
}
],
"excludedPaths": [
{
"path": "/OneOfTheColumns/*"
}
]
}
看起来问题在于datetime字段,需要将其作为字符串进行范围索引。我可以在文档中使用_ts字段。但是,如何更改复制作业以将查询的日期时间转换为纪元时间,并将其值用于_ts字段。
答案 0 :(得分:2)
您需要更新文档集合的索引策略以允许此查询。
假设您有一个类似&#34的查询;从c中选择*,其中c.property>"某些内容",此c.property必须具有范围索引。
答案 1 :(得分:2)
我不确定您使用的是哪种语言,所以我转发了您的问题,请参阅我的步骤。
我的示例文档:
[
{
"id": "1",
"name": "Jay",
"course": "A",
"score": 50
},
{
"id": "2",
"name": "Peter",
"course": "B",
"score": 20
}
]
指数政策:
{
"indexingMode": "consistent",
"automatic": true,
"includedPaths": [
{
"path": "/name/?",
"indexes": [
{
"kind": "Hash",
"dataType": "String",
"precision": 3
},
{
"kind": "Range",
"dataType": "Number",
"precision": -1
}
]
}
],
"excludedPaths": [
{
"path": "/*"
}
]
}
来源查询:(SELECT c.id,c.name,c.course,c.score FROM c where c.score>30)
重现您的问题:
Range支持高效的等式查询,范围查询(使用>,<,
=,< =,!=)和ORDER BY查询。 ORDER默认情况下,查询还需要最大索引精度(-1)。数据类型可以是String或 号。
当你有范围查询时,你需要在字段上定义范围索引。请参阅官方doc。
因此,我修改了上述索引策略并成功复制了数据:
{
"indexingMode": "consistent",
"automatic": true,
"includedPaths": [
{
"path": "/*",
"indexes": [
{
"kind": "Range",
"dataType": "Number",
"precision": -1
},
{
"kind": "Range",
"dataType": "String",
"precision": -1
},
{
"kind": "Spatial",
"dataType": "Point"
}
]
}
],
"excludedPaths": []
}
希望它对你有所帮助。