GridFS 中的 C# MongoDB 驱动程序下载文件

问题描述 投票:0回答:2

我有一个 c# .net core 项目,我正在尝试下载存储在 GridFS 中的文件。上传工作正常,使用 3T studio 我可以访问文件,但任何下载命令都会抛出异常

var bucket = new GridFSBucket(_context.Database);  
var bytes = bucket.DownloadAsBytesByName("b7be1813-589a-4a0b-b720-70f9efd165aa");

抛出的异常是:

命令查找失败:Error=2 {"Errors":["指定order-by项对应的索引路径被排除。"]

我不明白这里出了什么问题,我最初使用驱动程序创建 GridFS 存储桶,因此索引应该是正确的,我不知道它将尝试排序什么,从而导致此问题。无论我使用哪个下载命令,它们都会失败并出现相同的错误

任何帮助表示赞赏

c# .net mongodb gridfs
2个回答
1
投票

我遇到了同样的问题并挖掘了一下。

根据 this 文档,此错误对应于

The query requests a sort on a field that is not indexed.
GridFS 存储桶作为名称为
chunks
files
的两个集合存在于 MongoDB 中。查看
DownloadAsBytesAsync
方法实现,我发现一个查询包含对
n
集合中的
*.chunks
字段进行排序。所以,我在
n
字段上添加了一个索引,它起作用了!

//Creating index on n field in chunks collection
var collection = mongoDb.GetCollection<dynamic>("contents.chunks");
await collection.Indexes.CreateOneAsync(new CreateIndexModel<dynamic>("{'n': 1}"));

//Working with gridfs bucket
var bucket = new GridFSBucket(mongoDb, new GridFSBucketOptions {BucketName = "contents"});
var inputBytes = new byte[] {100, 200, 50, 30};
var id = await bucket.UploadFromBytesAsync("some_filename", inputBytes);
var bytes = await bucket.DownloadAsBytesAsync(id);

原生 MongoDB 自己创建这个索引,但 cosmosdb 实现的工作方式似乎有所不同。


© www.soinside.com 2019 - 2024. All rights reserved.