如何在新 Mongo 2.X 驱动程序中通过 UUID 获取 GridFS 文件

How to get GridFS file by UUID in new Mongo 2.X driver

众所周知,我们可以使用 ObjectId 作为我们的标识符。在我的情况下,我有遗留代码,我们在 MongoDB (UUID) 中使用 GUID 作为标识符。

Best Practices for UUID Data in MongoDB

我在通过 UUID.

GridFS 获取文件时遇到问题

我使用新的 MongoDB.Driver.GridFS 包并使用 GridFSBucket class.

我想通过 UUID 而不是 ObjectId 获取流,但我可以看到 DownloadToStream(XXX) 方法的所有重载都将 ObjectId 作为参数。 UUID.

没有重载

所以,问题是: 有什么方法可以安全地将 UUID 转换为 ObjectId 并尝试从 MongoDB?

获取文件

我们将不胜感激。

亚当

最新版本的 GridFS 规范要求存储的 GridFS 文件的 ID 类型为 ObjectId。

但由于可能存在存储在 GridFS 中的现有文件,其中 ID 是 而不是 ObjectId,因此 DownloadToStream 的重载采用 BsonValue id。

由于没有专门用于 GUID 的 BSON 类型,您可能拥有的任何 GridFS 文件(其 id 最初是 GUID)实际上会将 id 存储为 BsonBinary 值或 BsonString 值,具体取决于您选择的方式在 MongoDB.

中表示 GUID

因此,要读取使用 GUID 作为 id 存储的现有 GridFS 文件,您需要将该 GUID 转换为适当的 BsonValue,然后将该 BsonValue 传递给采用 BsonValue id 的 DownloadToStream 重载。

感谢罗伯特的回答。

是的,我将文件存储在 GridFS 中,其中 id 不是 ObjectId。

我做了更多的研究,发现在 GridFSBucket class 中为方法 DownloadToStreamAsync 设置了一个 Obsolete 属性集,例如:

[Obsolete("All new GridFS files should use an ObjectId as the Id.")]
public Task DownloadToStreamAsync(BsonValue id, Stream destination, GridFSDownloadOptions options = null, CancellationToken cancellationToken = null)

我也看到在IGridFSBucket接口中没有那个方法的相关签名,所以这就是我第一次找不到的原因。

我用过

private readonly GridFSBucket _gridFsBucket;

而不是使用

private readonly IGridFSBucket _gridFsBucket;

所以现在可以使用重载方法,我可以适当地使用 GUID BsonValue