如何查询 MongoDb 与 Guid Id 的部分 Id 匹配?

问题描述

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


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

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

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

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

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

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

解决方法

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

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

0xb59a9f9b428d3148b51867c2910428b3

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

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

您可以按照 Comparison/Sort Order

中所述对整个值进行比较

例如,您可以通过查询

来找到所有以 9b9f9ab5 开头的值
{$gte: Guid("9b9f9ab5-0000-0000-0000-000000000000"),$lt: Guid("9b9f9ab6-0000-0000-0000-000000000000")}

查询中间的部分,例如所有时间中间值为 0x8d42 的 UUID,如 00000000-8d42-0000-0000-0000000000000,将无法以二进制形式存储。