1,798
社区成员
发帖
与我相关
我的任务
分享
{
"_id" : ObjectId("58c793d279cec68b042d1d93"),
"fullName" : "文件名a",
"isFolder" : 1
}
{
"_id" : ObjectId("58c793d279cec68b042d1d94"),
"fullName" : "文件111.txt",
"parentId" : "58c793d279cec68b042d1d93",
"isFolder" : -1,
"dfsSize" : NumberLong(1024),
"ancestors" : [
"58c793d279cec68b042d1d93"
]
}
{
"_id" : ObjectId("58c793d279cec68b042d1d95"),
"fullName" : "文件222.txt",
"parentId" : "58c793d279cec68b042d1d93",
"isFolder" : -1,
"dfsSize" : NumberLong(256),
"ancestors" : [
"58c793d279cec68b042d1d93"
]
}
{
"_id" : ObjectId("58c793d279cec68b042d1d96"),
"fullName" : "文件夹b",
"parentId" : "58c793d279cec68b042d1d93",
"isFolder" : 1,
"ancestors" : [
"58c793d279cec68b042d1d93"
]
}
{
"_id" : ObjectId("58c793d279cec68b042d1d97"),
"fullName" : "文件夹bb",
"parentId" : "58c793d279cec68b042d1d96",
"isFolder" : 1,
"ancestors" : [
"58c793d279cec68b042d1d93",
"58c793d279cec68b042d1d96"
]
}
{
"_id" : ObjectId("58c793d279cec68b042d1d98"),
"fullName" : "文件哈哈.rar",
"parentId" : "58c793d279cec68b042d1d97",
"isFolder" : -1,
"dfsSize" : NumberLong(1024),
"ancestors" : [
"58c793d279cec68b042d1d93",
"58c793d279cec68b042d1d96",
"58c793d279cec68b042d1d97"
]
}
@Override
public Map<String, Long> getFolderSizeMap(List<String> folderIdList) {
//祖先查询
Criteria ancestorsCriteria = Criteria.where("ancestors").in(folderIdList);
//值查询文件
Criteria isNotFolderCriteria = Criteria.where("isFolder").in(NdFileContant.FILE_FOLDER_NOT);
//and查询
Criteria where = getAndCriteria(ancestorsCriteria,isNotFolderCriteria);
Aggregation aggregation = Aggregation.newAggregation(
Aggregation.match(where),//unwind前条件查询
Aggregation.unwind("ancestors"),
Aggregation.match(where),//unwind后条件查询(这步相当于具体查询了)
Aggregation.group("ancestors").sum("dfsSize").as("total") //分组统计总和
);
AggregationResults<BasicDBObject> results = this.mongoTemplate.aggregate(aggregation, this.actualClazz, BasicDBObject.class);
Map<String, Long> map = new HashMap<String, Long>();
for (BasicDBObject basicDBObject : results) {
map.put(basicDBObject.getString("_id"), basicDBObject.getLong("total"));
}
return map;
}
脚本类似于:
db.getCollection('ndFile').aggregate([
{$match:{ancestors:'58c8ac0079cec6c71cf4c8fe'}},
{$unwind:'$ancestors'},
{$match:{ancestors:'58c8ac0079cec6c71cf4c8fe'}},
{$group:{_id:'ancestors',total:{$sum:'$dfsSize'}}},
])