如何在新的Mongo 2.X驱动程序中使用UUID获取GridFS文件

时间:2015-11-06 16:46:04

标签: c# mongodb mongodb-.net-driver gridfs gridfs-stream

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

Best Practices for UUID Data in MongoDB

我遇到了通过 UUID GridFS 获取文件的问题。

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

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

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

任何帮助将不胜感激。

亚当

2 个答案:

答案 0 :(得分: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重载。

答案 1 :(得分:0)

感谢罗伯特的回答。

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

我做了一些研究,我发现在GridFSBucket类中为方法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