Это может быть длинный выстрел, но здесь мы go. Предположим, у меня есть следующее определение документа:
public class Test1 {
public ObjectId Id {get;set;}
public int NonUniqueId { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
Используя IMongoCollection<Test1>
, я могу отфильтровать результаты по документам, в которых Name = "somevalue"
, отсортировать по Price
и вернуть только 10 строк.
var builder = Builders.Filters;
var filter = builder.Where(x=>x.Name == "somevalue");
var result = await collection.Find(filter).SortBy(x=>x.Price).Limit(10).ToListAsync();
Теперь к вопросу. Если фильтр возвращает более одного документа (с Name = "somevalue"
) и NonUniqueId
встречается более одного раза в этом наборе, я хотел бы исключить дубликаты NonUniqueId
и вернуть только тот, который имеет наименьшее значение Price
.
Эту логику c довольно легко реализовать в коде: получить 10 результатов, если какой-либо из них является «дубликатом» (т. Е. NonUniqueId
встречается более одного раза), сохранить тот, который имеет наименьшую цену и запустите другой поиск, исключая этот NonUniqueId
. Однако для этого требуется несколько вызовов БД, что не очень хорошо (до 10 в худшем случае).
В MongoDB (с драйвером C#) есть способ игнорировать эти «дублирующие» результаты, основанные на свойство и, в идеале, вернуть только минимальное значение другого свойства (или что-либо с таким же эффектом)?