Mongo.Driver.LinqとMongoC#ドライバー2.3を使用して、フィルター処理されたサブドキュメントを含むドキュメントを返すにはどうすればよいですか?

D.レーガン

以下を考えると、どのように私は== TypeOfBarを持っている「ビッグ」のバーを含むすべてのFOOS返さないFOOS'バーはよくとしてTypeOfBar == 『ビッグ』を持っているものだけバーに限定されてきましたの?

public class Foo
{
    public string _id { get; set; }
    public List<Bar> Bars { get; set; }
}

public class Bar
{
    public string _id { get; set; }
    public string TypeOfBar { get; set; }
}

私は簡単に最初の部分を得ることができます(特定のタイプのバーを備えたすべてのFoos):

var client = new MongoClient("myconnectionstring");
var db = client.GetDatabase("myDb");
var collection = db.GetCollection<Foo>("Foos");

var foos = collection.AsQueryable().Where(x => x.Bars.Any(b => b.TypeOfBar == "Big"));

ただし、フィルタリングされたバーのリストを使用してdbにFoosを返す方法を理解するのに苦労しています。

マキシムシムキン

タイプが「Big」のこのFoosのみを除外する場合は、ElemMatchProjectionを適用する必要があります

var res = collection.Find(x => x.Bars.Any(b => b.TypeOfBar == "Big"))
    .Project(Builders<Foo>.Projection.ElemMatch(x=>x.Bars, b=>b.TypeOfBar == "Big"));

あなたがそれで持つであろう問題:プロジェクションはBSonを返します。おそらくそれはあなたが必要としているものであり、あなたはそれと一緒に暮らすことができます、そうでなければ、あなたはBsonをあなたのFooクラスに逆シリアル化する必要があります。私がした完全なクエリは次のようになりました:

var res = collection.Find(x => x.Bars.Any(b => b.TypeOfBar == "Big"))
    .Project(Builders<Foo>.Projection.ElemMatch(x=>x.Bars, b=>b.TypeOfBar == "Big"))
    .ToEnumerable()
    .Select(b=>BsonSerializer.Deserialize<Foo>(b))
    .ToList();

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ