Применение сетки фильтров MongoDB C#

#c# #asp.net #mongodb #filtering #gridfs

#c# #asp.net #mongodb #фильтрация #сетки

Вопрос:

Я пытаюсь отфильтровать свои данные на основе двух факторов. Первым фактором является docID (идентификатор объекта), а вторым фактором является DocType, который хранится в виде метаданных. Пример кода, который я вставляю.Я также прилагаю образец базы данных, как это выглядитвведите описание изображения здесь.

  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);
                        }

                    }
                }

            }
  

Но я не получаю правильного результата, это приводит к ошибкам. Кто-нибудь, пожалуйста, может указать, что я делаю неправильно или как писать фильтры на основе информации метаданных.

Комментарии:

1. Вы пытаетесь использовать .Eq(x => x.Id.ToString(), docId) для сопоставления на _id ?

Ответ №1:

Похоже, что это несколько проблем с приведенным выше кодом. Драйвер 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)
    amp; Builders<GridFSFileInfo<ObjectId>>.Filter.Eq(x => x.Id, docId);
  

Комментарии:

1. Спасибо за ваш ответ. Я понял, что происходит не так. Вы правильно указали на вещи. Итак, я пометил это как решенное.