1

mongodb コレクションからファセットを生成しようとしている典型的な Web アプリケーションがあります。これは現在、Java ドライバー (v2.10.1) を使用した集約フレームワークを使用して行われています。サブ配列を含むドキュメントを除いて、ファセットは正しく生成されます。たとえば、次の json ドキュメントがあります。

  1. {name: polo, fueltypes:[benzin, lpg], color: black}
  2. {name: golf, fueltypes:[benzin, cng], color: blue}
  3. {name: a4, fueltypes:[diesel], color: blue}

返される結果セットは次のとおりです。

名前:

{_id: polo, count: 1}
{_id: golf, count: 1}
{_id: a4, count: 1}

色:

{_id: black, count: 1}
{_id: blue, count: 2}

燃料の種類:

{_id: [benzin,lpg,cng,diesel], count: 3}

Fueltypes フィールドの集計結果には、すべての配列フィールドが含まれます。

ただし、望ましい結果は次のようになります。

燃料の種類:

{_id: benzin, count: 2}
{_id: lpg, count: 1}    
{_id: diesel, count: 1}    
{_id: cng, count: 1}    

および対応する Java コード:

String str = "name" ; //or fueltypes, color
// create match
BasicDBObject match = new BasicDBObject();
match.put("$match", new BasicDBObject());

// build the $projection operation
DBObject fields = new BasicDBObject();

// fields.put("count", 1);
DBObject project = new BasicDBObject();

// Now the $group operation
DBObject groupFields = new BasicDBObject();

DBObject unwindFields = new BasicDBObject();
// build the $projection operation
fields.put(str, 1);
project.put("$project", fields);

// Now the $group operation
groupFields.put("_id", "$" + str);

// performing sum and storing it in the count attribute
groupFields.put("count", new BasicDBObject("$sum", 1));

DBObject group = new BasicDBObject("$group", groupFields);
AggregationOutput output = serviceCollection.aggregate(match, project, group);
4

1 に答える 1

0

配列「fueltypes」でグループ化すると、配列自体の出現回数が得られます。

要素を個別にカウントするには、次のように $unwind 演算子を使用する必要があります。

// create unwind
BasicDBObject unwind = new BasicDBObject();
unwind.put("$unwind", "$" + str);

これを $group 演算子の前に含めます。または、str が「fueltypes」の場合にのみ $unwind を呼び出すこともできます。

アンワインドの詳細については、http: //docs.mongodb.org/manual/reference/aggregation/ を参照してください。

于 2013-04-01T19:18:37.857 に答える