-2

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

MongoDB 中 UUID 数据的最佳实践

我在通过UUID从GridFS获取文件时遇到问题。

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

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

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

任何帮助将不胜感激。

亚当

4

2 回答 2

1

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

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

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

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

于 2015-11-06T18:32:02.217 回答
0

谢谢罗伯特的回答。

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

我做了一些更多的研究,我发现在 GridFSBucket 类中为方法 DownloadToStreamAsync 设置了一个过时的属性,例如:

[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

于 2015-11-09T09:38:43.707 回答