我们知道,我们可以使用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获取文件?
任何帮助将不胜感激。
亚当
答案 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