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が初めてで、正確なアプローチを知りませんでした。上記のコードを使用しているときに、単一の番号のレコードを取得しています。これを修正するために私を案内してください。ティア

クラス構造

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

1 に答える 1

0

理想的にはnumbers、mongo でフィールドを区切り文字列ではなく配列としてモデル化することで、インデックスを追加し、クエリのパフォーマンスを調整できます。

ただし、これには集計パイプラインを利用できます。使用する次のような追加のクラスが必要になります。

    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 に答える