如何查询 MongoDb 与 Guid Id 的部分 Id 匹配?
How to query MongoDb for partial Id matches with Guid Id?
我有一个用 C# 编写的应用程序,其中的数据库是 MongoDB。 Id 对象是 C# Guid,因此数据库中的 _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")}
查询中间的部分,如00000000-8d42-0000-0000-000000000000等time-mid值为0x8d42的所有UUID,用二进制存储的值将无法查询。
我有一个用 C# 编写的应用程序,其中的数据库是 MongoDB。 Id 对象是 C# Guid,因此数据库中的 _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")}
查询中间的部分,如00000000-8d42-0000-0000-000000000000等time-mid值为0x8d42的所有UUID,用二进制存储的值将无法查询。