【问题标题】:Acceptable encoding for Cosmos DB IDs to replace illegal characters?Cosmos DB ID 的可接受编码以替换非法字符?
【发布时间】:2023-02-10 01:50:09
【问题描述】:

我正在尝试将数据存储在 ID 使用斜杠 (/) 的 Cosmos DB 中。然而,斜杠在 Cosmos ID 中是非法字符。我最初尝试通过 URL 编码斜杠 (%2F) 来解决这个问题,因为这是我通常通过 API 请求接收它们的形式。然而,虽然百分比 (%) 不是 ID 的非法字符,但 Cosmos 仍然无法检索 ID 中包含百分比的许多文档(它适用于某些文档,但如果 % 后跟某些字符它会出现)失败)。

是否有适用于 Cosmos DB ID 的编码,可以替换原始 ID 文本中的非法字符,而不会在编码的 ID 文本中引入非法或未处理的字符(如 %)?我宁愿远离像 Base64 这样的东西,这使得人们难以破译 ID。而且我还想避免简单的字符替换(/ 变成 -),以防 ID 使用替换字符。

【问题讨论】:

  • 这回答了你的问题了吗? Azure CosmosDB: illegal characters in Document Id
  • 请参阅相关(重复)问题。 Tl;dr 不——你不能在 id 中使用任何非法字符。
  • 我不想按原样使用非法字符。我正在尝试对文本进行编码以避免使用非法字符。我知道哪些字符是非法的(出于某种原因加上 %)。我在问是否有一种编码既可以替换非法字符又不会引入非法字符或未处理的字符,如百分号。
  • 一种选择是使用 base64Url 编码。它产生的所有字符都是允许的,大多数语言都有它的实现。
  • @Mr.AJ 我添加了一个不幸的是不是通用的解决方案。但是在使用 ValueConverters 时并不会太痛苦。由于我在手机上,因此代码可能不完全正确。

标签: azure azure-cosmosdb azure-cosmosdb-sqlapi


【解决方案1】:

我最终进行了简单的字符替换,将斜杠 (/) 替换为竖线 (|)。

让这个宜居的关键是添加一个带有 EntityFramework 的值转换器。

Expression<Func<string?, string>> toDB = v => v!.Replace("/", "|");
Expression<Func<string, string?>> fromDB = v => v!.Replace("|", "/");
builder.Property(p => p.Id).HasConversion(toDB, fromDB);

这允许在读取和写入数据库时​​自动进行字符替换。您唯一需要担心差异的情况是您是直接访问数据库还是从没有转换器的其他代码访问数据库。或者可能进行自定义搜索。我手动为我们使用的过滤框架进行翻译,我怀疑其他 ID 搜索解决方案也需要相同的手动翻译。

最终我决定这是可以接受的,因为我们不太可能有其他字符需要为我们的案例翻译,翻译很容易在视觉上完成,并且在大多数情况下使用 ValueConverters 是透明的。但它不是适用于任何可能的字符串 id 的通用解决方案。

编辑: 转念一想,这个解决方案是有缺陷的。 Cosmos 实际上确实允许创建 ID 中包含非法字符的文档,只是不允许轻松访问或删除它们。一个理想的解决方案是全面防止所有非法字符,无论预期与否。

【讨论】:

  • 感谢您花时间分享您的方法 @Rob Mosher!
  • 接受我自己的答案,因为它运行良好并且是目前唯一的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-04
  • 1970-01-01
  • 1970-01-01
  • 2018-12-06
  • 2021-11-09
  • 1970-01-01
  • 2011-06-20
相关资源
最近更新 更多