次のようなドキュメントのコレクションがあります。
{ name : "John" ,
age : 25.0 ,
bornIn : "Milan" ,
city : [ {
name : "Roma" ,
state : "IT" ,
mayor : "John"
}]
}
{ name : "Jim" ,
age : 35.0 ,
bornIn : "Madrid" ,
city : [ {
name : "Madrid" ,
state : "ESP" ,
mayor : "Jim"
}]
}
フィールド $bornIn がフィールド $city.name と等しいすべてのドキュメントを取得したいと考えています。これはパイプラインの中間段階として行う必要があるため、$where 演算子を使用できません。
オンラインで検索したところ、次のような実装の提案が見つかりました。
{ $project:
{ matches:
{ $eq:[ '$bornIn', '$city.name' ] }
}
},
{ $match:
{ matches:true }
} )
ただし、フィールドが異なるものとしてマークされるため、シェル経由でも Java ドライバー経由でも機能しませんでした。完全を期すために、コードを報告します。
final DBObject eq = new BasicDBObject();
LinkedList eqFields = new LinkedList();
eqFields.add("$bornIn");
eqFields.add("$city.name");
eq.put("$eq", eqFields);
projectFields.put("matches", eq);
final DBObject proj = new BasicDBObject("$project", projectFields);
LinkedList agg = new LinkedList();
agg.add(proj);
final AggregationOutput aggregate = table.aggregate( agg);
何か提案はありますか?私は MongoDB 3.2 を使用していますが、Java ドライバーを介してこれを行う必要があります。
ありがとう!!
PS。関係ありませんが、実際には上記のドキュメントは、コレクション「都市」と「人物」の間の $lookup ステージの出力であり、$name/$mayor で結合されています.. とてもクールです!! :D:D