簡體   English   中英

Json陣列(JAVA)上的Mongodb聚合

[英]Mongodb Aggregation on Json Array (JAVA)

我有一個典型的Web應用程序,在其中嘗試從mongodb集合生成構面。 當前,這是通過使用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);

按數組“ fueltypes”分組可為您提供數組出現的次數。

要單獨計算其元素,您必須使用$ unwind運算符,如下所示:

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

並將其包括在$ group運算符之前。 或者,僅當str為“ fueltypes”時,才可以調用$ unwind。

有關放松的更多信息,請參見http://docs.mongodb.org/manual/reference/aggregation/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM