0

次のようなドキュメントのコレクションがあります。

{ 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

4

1 に答える 1

1

Mongo がオブジェクトの配列を検索する深い等価性をどのように処理するかについては少しさびていますが、これは間違いなく実行可能です$unwind

db.foo.aggregate([
  {$unwind: "$city"},
  { $project:
       { matches:
            { $eq:[ '$bornIn', '$city.name' ] }
       } 
  }, 
  { $match:
        { matches:true }

  }
]);

現在、Mongo を使用しているコンピューターを使用していないため、構文が少しずれている可能性があります。

于 2015-11-20T18:53:04.720 に答える