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

Springデータの一致とフィルターのネストされた配列

    ここでは、"polaire"の「最初の」配列インデックスに一致するようにいくつかの値をハードコーディングします。 "matrice"の「2番目の」配列インデックス デモンストレーション用。ここで$elemMatchの使用法に注意してください $matchで 集約パイプラインステージと$mapの使用法 および$filter $projectで パイプラインステージ:

    Aggregation aggregation = newAggregation(
      match(
        Criteria.where("name").is("race").and("polaire").elemMatch(
          Criteria.where("voile").is("foc")
            .and("matrice").elemMatch(
              Criteria.where("vitRange.min").lt(5)
                .and("vitRange.max").gt(5)
                .and("twaRange.min").lt(32)
                .and("twaRange.max").gt(32)
            )
        )
      ),
      project("name")
        .and(new AggregationExpression() {
          @Override
          public DBObject toDbObject(AggregationOperationContext context) {
            return new BasicDBObject("$map",
              new BasicDBObject("input",new BasicDBObject(
                "$filter", new BasicDBObject(
                  "input", "$polaire")
                  .append("as","p")
                  .append("cond", new BasicDBObject("$eq", Arrays.asList("$$p.voile","foc")))
              ))
              .append("as","p")
              .append("in", new BasicDBObject(
                "voile", "$$p.voile")
                .append("matrice",new BasicDBObject(
                  "$filter", new BasicDBObject(
                    "input", "$$p.matrice")
                    .append("as","m")
                    .append("cond", new BasicDBObject(
                      "$and", Arrays.asList(
                        new BasicDBObject("$lt", Arrays.asList("$$m.vitRange.min", 5)),
                        new BasicDBObject("$gt", Arrays.asList("$$m.vitRange.max", 5)),
                        new BasicDBObject("$lt", Arrays.asList("$$m.twaRange.min", 32)),
                        new BasicDBObject("$gt", Arrays.asList("$$m.twaRange.max", 32))
                      )
                    ))
                ))
              )
            );
          }
        }).as("polaire")
    );
    

    これは、このシリアル化に変換されます:

    [
      { "$match": {
        "name": "race",
        "polaire": {
          "$elemMatch": {
            "voile": "foc",
            "matrice": {
              "$elemMatch": {
                "vitRange.min": { "$lt": 5 },
                "vitRange.max": { "$gt": 5 },
                "twaRange.min": { "$lt": 32 },
                "twaRange.max": { "$gt": 32 }
              }
            }
          }
        }
      }},
      { "$project": {
        "name": 1,
        "polaire": {
           "$map": {
             "input": {
               "$filter": {
                 "input": "$polaire",
                 "as": "p",
                 "cond": { "$eq": [ "$$p.voile", "foc" ] }
               } 
             },
             "as": "p",
             "in": {
               "voile": "$$p.voile",
               "matrice": {
                 "$filter": {
                   "input": "$$p.matrice",
                   "as": "m",
                   "cond": {
                     "$and": [
                       { "$lt": [ "$$m.vitRange.min", 5 ] },
                       { "$gt": [ "$$m.vitRange.max", 5 ] },
                       { "$lt": [ "$$m.twaRange.min", 32 ] },
                       { "$gt": [ "$$m.twaRange.max", 32 ] }
                     ]
                   }
                 }
               }
             }
           }
         }
      }}
    ]
    

    そして、一致したドキュメント出力を次のように生成します:

    {
        "_id" : ObjectId("593bc2f15924d4206cc6e399"),
        "name" : "race",
        "polaire" : [
            {
                "voile" : "foc",
                "matrice" : [
                        {
                                "vitRange" : {
                                        "min" : 4,
                                        "max" : 6
                                },
                                "twaRange" : {
                                        "min" : 30,
                                        "max" : 33
                                },
                                "values" : [
                                        0,
                                        0,
                                        2.4,
                                        3.7
                                ]
                        }
                ]
            }
        ]
    }
    

    $matchの「クエリ」部分 条件を満たす「ドキュメント」を実際に選択することが重要です。 $elemMatchを使用しない場合 式は、同じ内部要素に正しい条件がなくても実際にドキュメントに一致する可能性があり、実際には、ドキュメントに存在するすべての配列要素に分散されます。

    最初にネストされた配列をフィルタリングするには、$mapを使用します 「内部」配列要素も独自の「フィルタリング」の対象となるためです。したがって、両方の"input" $mapのソース "in"としての"output"も同様です。 $filterを参照してください 配列の特定の要素に一致させるための条件。

    「条件」として("cond" )から$filter ブール値の$andなどの「論理集計式」を利用します 他の「比較演算子」と同様に、対応する「クエリ演算子」と同じ条件を模倣します。これらは、「フィルタリングされた」結果で返される正しい配列項目に一致するロジックを担当します。

    参考までに、これは結果が取得されるソースデータであり、質問に投稿されたものと同じである必要があります。

    {
            "_id" : ObjectId("593bc2f15924d4206cc6e399"),
            "name" : "race",
            "polaire" : [
                    {
                            "voile" : "foc",
                            "matrice" : [
                                    {
                                            "vitRange" : {
                                                    "min" : 0,
                                                    "max" : 4
                                            },
                                            "twaRange" : {
                                                    "min" : 0,
                                                    "max" : 30
                                            },
                                            "values" : [
                                                    0,
                                                    0,
                                                    0,
                                                    2.4
                                            ]
                                    },
                                    {
                                            "vitRange" : {
                                                    "min" : 4,
                                                    "max" : 6
                                            },
                                            "twaRange" : {
                                                    "min" : 30,
                                                    "max" : 33
                                            },
                                            "values" : [
                                                    0,
                                                    0,
                                                    2.4,
                                                    3.7
                                            ]
                                    }
                            ]
                    },
                    {
                            "voile" : "spi",
                            "matrice" : [
                                    {
                                            "vitRange" : {
                                                    "min" : 0,
                                                    "max" : 4
                                            },
                                            "twaRange" : {
                                                    "min" : 0,
                                                    "max" : 30
                                            },
                                            "values" : [
                                                    0,
                                                    0,
                                                    0,
                                                    1.4
                                            ]
                                    },
                                    {
                                            "vitRange" : {
                                                    "min" : 4,
                                                    "max" : 6
                                            },
                                            "twaRange" : {
                                                    "min" : 30,
                                                    "max" : 33
                                            },
                                            "values" : [
                                                    0,
                                                    0,
                                                    1.4,
                                                    2.2
                                            ]
                                    }
                            ]
                    }
            ]
    }
    



    1. pymongo:名前'ISODate'が定義されていません

    2. MongoDBセキュリティの3つのA–認証、承認、監査

    3. 起動時にMongoDBコンテナ用のDBを作成するにはどうすればよいですか?

    4. MongoDBで多言語テキストインデックスを作成する