2016-08-31 14 views
1
/*first Table*/ 
DBCollection coll = db.getCollection("orgmembers"); 

/*second table*/ 
     DBObject lookupFields = new BasicDBObject("from", "orgcenters"); 
     lookupFields.put("localField", "mappings.centerId"); 
     lookupFields.put("foreignField", "_id"); 
     lookupFields.put("as", "collegeDetails"); 
     DBObject lookup = new BasicDBObject("$lookup", lookupFields); 

orgcentersスキーマ_id foriegnキーとは比較にならないルックアップ

{"_id" : ObjectId("5496d0a50cf2abd6b103b1a2"), "code" : "CEN-DVG", "name" : "Davangere"} 

orgmemberスキーマのMongoDB内検索がforiegnキー_id

とは比較にならない

{ "dob" : "1989-01-13", 
    "firstName" : "Sandeep", 
    "mappings" : [ { "programId" : "5496d0cd0cf2abd6b103b1a6", "centerId" : "5496d0a50cf2abd6b103b1a2"}] 
} 

+0

orgcentersテーブルは、{ "_idを" のObjectId( "5496d0a50cf2abd6b103b1a2")、 "コード": "CEN-DVG"、 "名前": "Davangere"、 }有する – aksy91

+0

orgmemberテーブルは、{ "DOB" を有します: "1989年1月13日"、 "firstNameの": "サンディープ"、 "マッピング":[{ "プログラムID": "5496d0cd0cf2abd6b103b1a6"、 "centerId": "5496d0a50cf2abd6b103b1a2"}]}} – aksy91

+1

でもあなたのコードは不完全ですが、私はあなたがこれらのコレクションを集約し、正しく行うかどうかを大雑把に推測できるだけです。間違いがすぐに分かります:orgmemberのcenterIdは文字列ですが、orgcenの_id tersはObjectIdです。これは一致しません - あなたは同じデータ型を使用する必要があります。 – mtj

答えて

1

localFieldが配列の場合、パイプラインを に$ unwindステージを追加する必要があります。このページの例を参照してください。我々は配列としてマッピングを持っているので、それは$の検索を実行する前にunwindedする必要がありますorgmember schema$lookup

を参照してください。私たちは、文字列として

注意を両方のIDを持っている場合

このクエリは動作します:文字列の両方にidを変更してください。

db.orgmember.aggregate([ 
{ 
    $unwind : "$mappings" 
}, 
{ 
    $lookup: 
    { 
     from: "orgcenters", 
     localField: "mappings.centerId", 
     foreignField: "_id", 
     as: "collegeFields" 
    } 
}]) 

クエリでは、$ unwindオプションが見つからないため、結果が得られません。

希望に役立つ!

+0

lookupFields = new BasicDBObject( "from"、 "orgcenters");を追加しました。 lookupFields.put( "localField"、 "{$ toObjectId:$ mappings.centerId}"); lookupFields.put( "foreignField"、 "_id"); lookupFields.put( "as"、 "collegeDetails"); DBObjectルックアップ=新しいBasicDBObject( "$ lookup"、lookupFields); //まだ動作しませんでした – aksy91