sql >> データベース >  >> NoSQL >> MongoDB

Mongodb C#ドライバーは、配列内の一致するサブドキュメントのみを返します

    通常、ネストされた配列をフィルタリングするには、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 ここでは、既存のフィールドを上書きするために使用されます。




    1. gradleはローカル作品を構築します。 Dockerコンテナーでは、そうではありません。なぜ?

    2. ubuntuのデフォルトポート6379とは異なるポートでredis-serverを起動する方法

    3. UbuntuのGolangにあるMongoCloudmongodbデータベースに接続できません

    4. メモリとCPUスパイクをredisします