[英]Mongodb Aggregation on Json Array (JAVA)
我有一個典型的Web應用程序,在其中嘗試從mongodb集合生成構面。 當前,這是通過使用Java驅動程序(v2.10.1)的聚合框架來完成的。 除了包含子數組的文檔外,構面均已正確生成,例如,我具有以下json文檔:
{name: polo, fueltypes:[benzin, lpg], color: black}
{name: golf, fueltypes:[benzin, cng], color: blue}
{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.