0

我想在 C# 中使用逗号分隔的字符串从 mongo 获取数据。下面是我的代码。

 string numbers = "32,12,56,78";
 List<CustomerNumbers> calling_number= new List<CDRs>();

 IMongoCollection<CustomerNumbers> Collec;

 calling_number= Collec.Find(x => x.customer == ID && x.numbers.Contains(numbers)).ToList();

我是 mongo 的新手,并且不知道确切的方法。在使用上面的代码时,我正在获取单个数字的记录。请指导我解决这个问题。TIA

类结构

public class CustomerNumbers
{
    public string numbers { get; set; }
    public int customer { get; set; }
}
4

1 回答 1

0

理想情况下,您应该将numbersmongo 中的字段建模为数组而不是分隔字符串,这将允许您添加索引并调整查询的性能。

但是,我们可以为此使用聚合管道。我们需要一个额外的类,如下所示:

    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"] } } } }
]
于 2020-03-05T10:12:25.940 回答