Я пишу сервис для обработки запретов для игры, и в настоящее время я немного застрял, пытаясь написать запрос MongoDB. В настоящее время у меня есть коллекция объектов «Пользователь», и объекты выглядят так:
public class User
{
public List<Ban> Bans { get; set; }
// some irrelevant additional fields
}
public class Ban
{
public HardwareId HWID { get; set; }
public DateTime Expires { get; set; }
// some irrelevant additional fields
}
public class HardwareId : IEquatable<HardwareId>
{
public string Field1 { get; set; }
public string Field2 { get; set; }
public string Field3 { get; set; }
public string Field4 { get; set; }
public bool Equals([AllowNull] HardwareId other)
{
if (ReferenceEquals(other, null)) return false;
if (ReferenceEquals(this, other)) return true;
return Field1 == other.Field1 &&
Field2 == other.Field2 &&
Field3 == other.Field3 &&
Field4 == other.Field4;
}
}
Я хочу сделать запрос, который находит всех пользователей с баном, где HWID сказал 3 из 4 поля совпадают. В настоящее время у меня есть запрос, который находит пользователей только с точным совпадением HWID (благодаря реализации Equals ()), но я бы хотел его изменить. Мой текущий код выглядит следующим образом:
public Ban FindBan(HardwareId hwid)
{
var banBuilder = Builders<Ban>.Filter;
var hwidFilter = banBuilder.Eq(b => b.HWID, hwid);
var expFilter = banBuilder.Gt(b => b.Expires, DateTime.UtcNow);
var banFilter = banBuilder.And(hwidFilter, expFilter);
var user = _users.Find(Builders<User>.Filter.ElemMatch(p => p.Bans, banFilter)).FirstOrDefault();
if (user != null)
{
return user.Bans[0];
}
return null;
}
Единственный способ его решения, о котором я могу подумать, - написать «спагетти-операторы if» в функции Equals (), но я бы хотел динамик c решение, где я мог бы добавить несколько «полей» в класс HardwareId позже по линии. Еще одна проблема с функцией FindBan () в настоящее время заключается в том, что она возвращает «user.Bans [0]» вместо фактического найденного бана, но я думаю, что могу решить эту проблему, отсортировав по истечению срока действия.