应用过滤器GridFS MongoDb C#

问题描述

我正在尝试根据两个因素来过滤我的数据。第一个因素是docID(对象ID),第二个因素是DocType,它存储为元数据。我要粘贴的示例代码。我还将附加示例数据库的外观

enter image description here

 public async Task<ActionResult> DeleteDocument([Fromroute] int docType,[Fromroute] string docId)
        {
            try
            {
                var filter = Builders<GridFSFileInfo>.Filter.And(
    Builders<GridFSFileInfo>.Filter.Eq(x => x.Metadata.GetValue("DocType"),docType),Builders<GridFSFileInfo>.Filter.Eq(x => x.Id.ToString(),docId));
                
                using (var cursor = await Bucket.FindAsync(filter))
                {
                    var fileInfos = (await cursor.ToListAsync());
                    foreach (GridFSFileInfo fileInfo in fileInfos)
                    {

                        foreach (BsonElement bsonE in fileInfo.Metadata.ToList())
                        {
                            Console.WriteLine(fileInfo.Filename);
                        }

                    }
                }

            }

但是我没有得到正确的结果,这给了我错误。谁能指出我做错了什么,或者如何根据元数据信息编写过滤器。

解决方法

看起来上面的代码有一些问题。 MongoDB驱动程序正在努力将这些表达式转换为MongoDB查询。

.Eq(x => x.Metadata.GetValue("DocType"),docType)
.Eq(x => x.Id.ToString(),docId)

这是因为您需要使用索引器来访问元数据的字段,还需要将docId更改为正确的类型,然后再将其与ID字段进行比较。

尝试以下过滤器。

var docType = 1;
var docId = ObjectId.Parse("5f3ce002796ba13443aa4bc5");

var filter = 
    Builders<GridFSFileInfo<ObjectId>>.Filter.Eq(x => x.Metadata["DocType"],docType)
    & Builders<GridFSFileInfo<ObjectId>>.Filter.Eq(x => x.Id,docId);