通常、ネストされた配列をフィルタリングするには、AggregationFrameworkで$filterを使用する必要があります。ただし、MongoDB.NETドライバーとIQueryable を使用して、これを実現する簡単な方法があります。 インターフェース。
最も単純なモデルを検討する:
public class MyModel
{
public string _id { get; set; }
public IEnumerable<MyNestedModel> myArray { get; set; }
}
public class MyNestedModel
{
public string other { get; set; }
}
および以下のデータ:
var m = new MyModel()
{
_id = "1",
myArray = new List<MyNestedModel>() {
new MyNestedModel() { other = "stuff" },
new MyNestedModel() { other = "stuff" },
new MyNestedModel() { other = "stuff2" } }
};
Col.InsertOne(m);
.AsQueryable()
を呼び出すだけです。 コレクションに、MongoDBドライバーによって$filter
に変換されるLINQクエリを記述できます。 、試してみてください:
var query = from doc in Col.AsQueryable()
where doc._id == "1"
select new MyModel()
{
_id = doc._id,
myArray = doc.myArray.Where(x => x.other == "stuff")
};
var result = query.ToList();
編集:
または、$filter
と書くこともできます 生の文字列として分割し、.Aggregate()
を使用します 方法。このアプローチを使用すると、すべてのプロパティを「マッピング」する必要はありませんが、これは単なる文字列であるため、型の安全性が失われるという欠点があります。試してみてください。
var addFields = BsonDocument.Parse("{ \"$addFields\": { myArray: { $filter: { input: \"$myArray\", as: \"m\", cond: { $eq: [ \"$$m.other\", \"stuff\" ] } } } } }");
var query = Col.Aggregate()
.Match(x => x._id == "1")
.AppendStage<MyModel>(addFields);
$addFields
ここでは、既存のフィールドを上書きするために使用されます。