В идеале вы должны смоделировать поле numbers
в пн go как массив, а не как строку с разделителями, это позволит вам добавлять индексы и настраивать производительность ваших запросов.
Однако, для этого мы можем использовать конвейер агрегации. Нам понадобится дополнительный класс, подобный следующему, который мы будем использовать:
public class CustomerNumbersSplit
{
public string[] numbers { get; set; }
public int customer { get; set; }
}
Нам также понадобится разбить строку, разделенную запятыми.
var numbers = "32,12,56,78";
var numbersSplit = numbers.Split(",", StringSplitOptions.RemoveEmptyEntries)
.Select(int.Parse)
.ToArray();
Один раз мы сделали, что можем написать запрос следующим образом:
var result = await collection.Aggregate()
.Match(x => x.customer == ID)
.AppendStage<CustomerNumbersSplit>(@"{ $addFields: { numbers: { $split: [""$numbers"", "","" ] } } }")
.Match(x => x.numbers.Any(y => numbersSplit.Contains(y)))
.ToListAsync();
Это использует $ split и $ addFields, поэтому мы можем использовать механизм базы данных для разделения числа и запроса их в ядре базы данных.
Если вас интересует сгенерированный запрос:
[
{ "$match" : { "customer" : 12324 } },
{ "$addFields" : { "numbers" : { "$split" : ["$numbers", ","] } } },
{ "$match" : { "numbers" : { "$elemMatch" : { "$in" : ["32", "12", "56", "78"] } } } }
]