2016-11-22 45 views
1

我有我的MongoDB的文档结构GROUPBY一个字段值和Sortby另一个字段,如下图所示:如何在MongoDB中

{ 
     "_id" : NumberLong(366), 
     "_class" : "com.cts.adpart.domain.DBData", 
     "file" : "xyz", 
     "meta" : { 
         "owner" : "user123", 
     }, 
     "curFlag" : true 
} 
  1. 我要检查它有curFlag真的
  2. 一个特殊的文件所有者可以处理n没有文件,所以我必须GroupBy所有者并显示特定用户正在处理的文件的数量。
  3. 最后根据每个用户正在处理的文件数量,我必须显示处理大号的用户。的文件。

对于上述说明,我写了下面的代码。

Map<String, Object> dbObjIdMap = new HashMap<String, Object>(); 
dbObjIdMap.put("owner", "$meta.owner"); 
dbObjIdMap.put("curFlag", "$curFlag"); 
DBObject groupFields = new BasicDBObject("_id", new BasicDBObject(dbObjIdMap)); 

groupFields.put("count", new BasicDBObject("$sum", 1)); 
DBObject group = new BasicDBObject("$group", groupFields); 

而且它给我像下面的输出:

{ "_id" : { "owner" : "[email protected]", "curFlag" : true }, "count" : 1 } 
{ "_id" : { "owner" : "[email protected]", "curFlag" : false }, "count": 1 } 

但我希望有老板对他们来说,curFlag是真正的唯一的方式,我一定要显示主人处理多个文件的数量。

任何人都可以帮我解决这个问题吗?

回答

1

翻译您的需求转化为代码,你会得到下面的管道(蒙戈外壳版本):

// 1. Check for documents which have curFlag true 
var match = { "$match": { "curFlag": true } }; 

// 2. GroupBy owner and display the number of files that particular user is handling 
var group = { 
    "$group": { 
     "_id": "$meta.owner", 
     "count": { "$sum": 1 } 
    } 
}; 

// 3. Display the user who is handling large no. of files 
var sort = { "$sort": { "count": -1 } }, 
    limit = { "$limit": 1 }; 

// Run pipeline 
db.mycollection.aggregate([match, group, sort, limit]) 

Java实现:

public class JavaAggregation { 
    public static void main(String args[]) throws UnknownHostException { 

     MongoClient mongo = new MongoClient(); 
     DB db = mongo.getDB("test"); 

     DBCollection coll = db.getCollection("mycollection"); 

     // 1. Check for documents which have curFlag true 
     DBObject match = new BasicDBObject("$match", 
          new BasicDBObject("curFlag", true) 
         ); 

     // 2. GroupBy owner and display the number of files per user 
     DBObject groupFields = new BasicDBObject("_id", "$meta.owner"); 
     groupFields.put("count", new BasicDBObject("$sum", 1)); 
     DBObject group = new BasicDBObject("$group", groupFields); 

     // 3. Display the user who is handling large no. of files 
     DBObject sort = new BasicDBObject("$sort", 
          new BasicDBObject("count", -1) 
         ); 
     DbObject limit = new BasicDBObject("$limit", 1); 

     List<DBObject> pipeline = Arrays.asList(match, group, sort, limit); 

     AggregationOutput output = coll.aggregate(pipeline); 

     for (DBObject result : output.results()) { 
      System.out.println(result); 
     } 
    } 
} 
+0

或者与v3的驱动程序:AggregateIterable RES =文档.aggregate(Arrays.asList(Aggregates.match(Filters.eq(“curFlag”,true)),Aggregates.sort(Sorts.orderBy(Sorts.descending(“count”))),Aggregates.group(“$ meta。所有者“,Accumulators.sum(”count“,”1“)),Aggregates.limit(1))); //格式化为读者,因为这是一条评论,而不是一个答案;-) – mtj

+0

不知道集合中的数据,我无法确切知道为什么它只返回一个用户。你可以编辑你的问题,以显示更多的示例文件与不同的用户? – chridam