#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. Спасибо за ваш ответ. Я понял, что происходит не так. Вы правильно указали на вещи. Итак, я пометил это как решенное.