다음과 같이 mongodb 문서 구조가 있습니다.
{
"_id" : NumberLong(366),
"_class" : "com.cts.adpart.domain.DBData",
"file" : "xyz",
"meta" : {
"owner" : "user123",
},
"curFlag" : true
}
curFlag
사실 인 문서를 확인해야 합니다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" : "[email protected]", "curFlag" : true }, "count" : 1 }
{ "_id" : { "owner" : "[email protected]", "curFlag" : false }, "count": 1 }
그러나 나는 curFlag
진실한 소유자의 세부 사항만을 원하고 더 많은 수의 파일을 처리하는 소유자를 표시해야합니다.
누구든지 솔루션으로 나를 도울 수 있습니까?
요구 사항을 코드로 변환하면 다음 파이프 라인 (mongo 셸 버전)이 제공됩니다.
// 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])
자바 구현 :
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);
}
}
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다