我的mongodb文档结构如下所示:
{
"_id" : NumberLong(366),
"_class" : "com.cts.adpart.domain.DBData",
"file" : "xyz",
"meta" : {
"owner" : "user123",
},
"curFlag" : true
}
curFlag
true n
个文件,因此我必须GroupBy
所有者并显示特定用户正在处理的文件数。 对于上述陈述,我写了下面的代码。
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" : "xyz@gmail.com", "curFlag" : true }, "count" : 1 }
{ "_id" : { "owner" : "xyz@gmail.com", "curFlag" : false }, "count": 1 }
但我想只提供curFlag
为真的所有者的详细信息,并且我必须显示所有者处理更多文件。
任何人都可以帮我解决这个问题吗?
答案 0 :(得分:1)
将您的需求转换为代码,您将获得以下管道(mongo shell版本):
// 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);
}
}
}