【问题标题】:How to query MongoDb for partial Id matches with Guid Id?如何使用 Guid Id 查询 MongoDb 的部分 Id 匹配?
【发布时间】:2021-06-20 14:25:36
【问题描述】:

我有一个用 C# 编写的应用程序,其中数据库是 MongoDB。 Id 对象是 C# Guid,因此 DB 中的 _id 字段如下所示:


  "_id": {
    "$binary": {
      "base64": "tZqfm0KNMUi1GGfCkQQosw==",
      "subType": "03"
    }
  }

并且该应用正在使用常规 Guid ("9b9f9ab5-8d42-4831-b518-67c2910428b3")

现在,我想添加按部分 id 搜索的功能 - 如果我搜索“67c2910428b3”,我想找到具有相应 id 的对象。

如何添加过滤器\查询来做到这一点?

我不能使用 BsonRegex,因为 db 中的字段没有“转换” - 它永远不会得到 Guid-id。

“简单”的解决方案是在 MongoDB 中添加另一个字段,并将 Guid 作为字符串,这样我就可以对其进行搜索 - 但这似乎是多余的,因为 id 已经存在。

【问题讨论】:

  • 部分匹配是否总是在 UUID 的开头?
  • 不,它可以是它的任何部分。

标签: c# mongodb guid


【解决方案1】:

bson spec 开始,二进制子类型 3 是旧的 UUID 格式。旧格式的问题之一是它允许客户端指定字节的顺序。

从base-64字符串解码,该字段的值为:

0xb59a9f9b428d3148b51867c2910428b3

请注意,您提到的这个 UUID,但使用的客户端排序不符合 RFC-4122 section 4.1.2,这需要每个字段的 MSB 排序。

MongoDB 将 UUID 存储为二进制 blob。没有服务器端函数可以将值转换或分割成更小的块。

您可以按照Comparison/Sort Order 中的说明对整个值进行比较

例如,您可以通过查询找到所有以9b9f9ab5 开头的值

{$gte: Guid("9b9f9ab5-0000-0000-0000-000000000000"), $lt: Guid("9b9f9ab6-0000-0000-0000-000000000000")}

查询中间的部分,例如所有 UUID 的时间中间值为 0x8d42,如 00000000-8d42-0000-0000-000000000000,对于存储为二进制的值是不可能的。

【讨论】:

    猜你喜欢
    • 2012-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-27
    • 2011-02-19
    • 1970-01-01
    • 2013-01-23
    • 1970-01-01
    相关资源
    最近更新 更多