0

別のネストされたリストのネストされたドキュメントオブジェクトを取得するのが難しいです。同じ問題を解決するのを手伝ってください。次のように私のMongoDBドキュメントは、次のとおりです。ドキュメントの別のネストされたリストのネストされたレコードをフェッチする方法はありますか?

{ 
"_id" : "PT5", 
"departmentId" : "DEPT5", 
"subDepartmentList" : [ 
    { 
     "subDepartmentId" : "SUBDEPT19", 
     "subDepartmentName" : "X-Ray", 
     "labServiceList" : [ 
      { 
       "_id" : "123abc", 
       "subDepartmentId" : "SUBDEPT19", 
       "labServiceName" : "serviceOne" 
      }, 
      { 
       "_id" : "123def", 
       "subDepartmentId" : "SUBDEPT19", 
       "labServiceName" : "hello", 
       } 
     ] 
    }, 
    { 
     "subDepartmentId" : "SUBDEPT21", 
     "subDepartmentName" : "Haemotology", 
     "labServiceList" : [ 
      { 
       "_id" : "456abc", 
       "subDepartmentId" : "SUBDEPT21", 
       "labServiceName" : "abcd", 
       } 
     ] 
    } 
] 

}

私はその_id値を使用してlabServiceListの1つのオブジェクトのみを取得したい上記の文書(例から:「_id」:この文書の「123ABC」 )。そして、私は、ネストされた一致するドキュメントとは別のフィールドを取得したくありません。私は、以下のクエリを使用して試してみました:

db.labServiceMasters.aggregate([ 
{"$project": { 
    "subDepartmentList": {"$filter": { 
     "input": '$subDepartmentList.labServiceList', 
     "as": 'labServiceList', 
     "cond": {"$eq": ['$$labServiceList._id', '123abc']} 
    }}, 
    "_id": 0 
}} 

])

また、私は$マップ演算子を使用して試してみましたが、何も私の方法に行きません。この問題を解決するのを手伝ってください。また、JavaのmongoTemplateを使用して、同じもののクエリを書くのを手伝ってください。どんな提案も認められるでしょう。

答えて

1

:-)事前に感謝は、あなたが実際に$map内の巣に$filterと別の$filter内部$mapを必要としています。そして、単一のエントリを取得するために$arrayElemAtを使用します。

db.labServiceMasters.aggregate([ 
    { "$project": { 
    "subDepartmentList": { 
     "$arrayElemAt": [ 
     { "$filter": { 
      "input": { 
      "$map": { 
       "input": "$subDepartmentList", 
       "as": "sd", 
       "in": { 
       "$arrayElemAt": [ 
        { "$filter": { 
        "input": "$$sd.labServiceList", 
        "as": "ls", 
        "cond": { "$eq": [ "$$ls._id", "123abc" ] } 
        }}, 
        0 
       ] 
       } 
      } 
      }, 
      "as": "sd", 
      "cond": { "$ne": [ "$$sd", null ] } 
     }}, 
     0 
     ] 
    } 
    }} 
]) 

戻り値:

{ 
    "_id" : "PT5", 
    "subDepartmentList" : { 
     "_id" : "123abc", 
     "subDepartmentId" : "SUBDEPT19", 
     "labServiceName" : "serviceOne" 
    } 
} 

春、MongoDBのためのものです:

Aggregation aggregation = newAggregation(
     project("subDepartmentList").and(new AggregationExpression() { 
      @Override 
      public DBObject toDbObject(AggregationOperationContext context) { 
       return new BasicDBObject(
       "$arrayElemAt", Arrays.asList(
        new BasicDBObject("$filter", 
        new BasicDBObject("input", 
         new BasicDBObject("$map", 
         new BasicDBObject("input","$subDepartmentList") 
          .append("as","sd") 
          .append("in",new BasicDBObject(
          "$arrayElemAt", Arrays.asList(
           new BasicDBObject("$filter", 
           new BasicDBObject("input","$$sd.labServiceList") 
            .append("as","ls") 
            .append("cond", new BasicDBObject("$eq", Arrays.asList("$$ls._id","123abc"))) 
          ), 
           0 
          ) 
         )) 
        ) 
        ) 
        .append("as","sd") 
        .append("$ne", Arrays.asList("$$sd", null)) 
       ), 
        0 
       ) 
      ); 
      } 
     }).as("subDepartmentList") 
    ); 

と同じことをシリアライズ:

{ 
    "aggregate": "labServiceMasters", 
    "pipeline": [ 
    { 
     "$project": { 
     "subDepartmentList": { 
      "$arrayElemAt": [ 
      { 
       "$filter": { 
       "input": { 
        "$map": { 
        "input": "$subDepartmentList", 
        "as": "sd", 
        "in": { 
         "$arrayElemAt": [ 
         { 
          "$filter": { 
          "input": "$$sd.labServiceList", 
          "as": "ls", 
          "cond": { 
           "$eq": [ 
           "$$ls._id", 
           "123abc" 
           ] 
          } 
          } 
         }, 
         0.0 
         ] 
        } 
        } 
       }, 
       "as": "sd", 
       "$ne": [ 
        "$$sd", 
        null 
       ] 
       } 
      }, 
      0.0 
      ] 
     } 
     } 
    } 
    ] 
} 
+0

多くのありがとうNeil :-)あなたは私の一日を救った...これは私が欲しかったもので、達成するために一日中苦労したものです。あなたの答えでは、私はシェルのクエリを試して、完全に上質です。私はJavaのクエリを試すことができませんでしたし、私は後で同じ小さなを実行しようとするだろうし、私もそれも動作します:-)おかげでもう一度束:-) – Manju

+0

ニール私はJavaのクエリで動作しようとしましたが、コンパイルエラーが発生しているので達成できませんでした。私はすべての方法を試しましたが、何も動作しません。あなたがエラーを追跡することができれば助けてください。 JavaのクエリがmongoTemplateを使用している場合は、Springを使用しているので、私にとってはもっと役立ちます。ありがとうございます:-) – Manju

+0

@ user3418760これは私のIDEのすぐカット&ペーストのコードなので、確かに動作します。あなたが問題を抱えているのなら、それは自分で打ち込んでいるからです。同じコードを「コピー」することをお勧めします。パイプラインを自分で書く方法を理解するまで、このコードを使用してください。また、あなたのプロジェクトでsping-mongodbを最新バージョンに更新したことを確認してください。 –

0

以下の集計を使用できます3.4のation照会インナー$filter発現内部

使用$in_id123abcとのマッチング($eq)要素を選択するために、外側$filter続い_id123abcを含有するネストされた配列(labServiceList)を検索します。

[ 
    { 
    "$project": { 
     "subDepartmentList": { 
     "$arrayElemAt": [ 
      { 
      "$filter": { 
       "input": { 
       "$arrayElemAt": [ 
        { 
        "$filter": { 
         "input": "$subDepartmentList.labServiceList", 
         "as": "inn", 
         "cond": { 
         "$in": [ 
          "123abc", 
          "$$inn._id" 
         ] 
         } 
        } 
        }, 
        0 
       ] 
       }, 
       "as": "out", 
       "cond": { 
       "$eq": [ 
        "$$out._id", 
        "123abc" 
       ] 
       } 
      } 
      }, 
      0 
     ] 
     } 
    } 
    } 
] 
+0

こんにちはVeeram、私は3.2.9を使用して、まだあなたの答えを試みたが、出力を得ることができませんでした。とにかくあなたの答えを束ねてくれてありがとう:-) – Manju

関連する問題