【发布时间】:2017-03-24 04:10:07
【问题描述】:
目前我可以根据 filePrefix 进行分组,并使用 max fileId 获取记录。
在输出中,我可以获取 filePrefix 和 fileId,但无法获取 fileName 以及 filePrefix 和 fileId。
谁能帮我解决这个问题...
我的文件:
{
"_id" : ObjectId("58cbe224238b3953da3bc0bc"),
"fileName" : "samplefile1_124.txt",
"filePrefix":"samplefile1",
"fileId":124
}
{
"_id" : ObjectId("58cbe257238b3953da3bc0bd"),
"fileName" : "samplefile2_125.txt",
"filePrefix":"samplefile2",
"fileId":125
}
{
"_id" : ObjectId("58cf8d13f731b796bc343726"),
"fileName" : "samplefile3_126.dat",
"filePrefix":"samplefile3",
"fileId":126
}
{
"_id" : ObjectId("58cfa525f731b796bc343727"),
"fileName" : "samplefile1_126.txt",
"filePrefix":"samplefile1",
"fileId":126
}
{
"_id" : ObjectId("58cfa525f731b796bc343728"),
"fileName" : "samplefile2_127.txt",
"filePrefix":"samplefile2",
"fileId":127
}
我的代码:
MongoClient mongo = new MongoClient("localhost",27017);
MongoDatabase db = mongo.getDatabase("fileDB");
MongoCollection<Document> col = db.getCollection("fileStatus");
List<String> docsList = new ArrayList<>();
docsList.add("samplefile1");
docsList.add("samplefile2");
docsList.add("samplefile3");
Set<String> docsSet = new HashSet<>();
for(String st: docsList){
docsSet.add(st);
}
Document match = new Document("$match", new Document("filePrefix",new Document("$in",docsSet)));
Document group = new Document("$group" , new Document("_id","$filePrefix").append("fId", new Document("$max","$fileId")));
Document project = new Document("$project",new Document("filePrefix","$_id").append("fileId", "$fId"));
AggregateIterable<Document> output = col.aggregate(Arrays.asList(match,group,project));
for (Document dbObject : output)
{
System.out.println(dbObject);
}
我的输出:
文档{{_id=samplefile1, filePrefix=samplefile1, fileId=126.0}}
文档{{_id=samplefile2, filePrefix=samplefile2, fileId=127.0}}
文档{{_id=samplefile3, filePrefix=samplefile3, fileId=126.0}}
【问题讨论】:
-
在小组赛中使用
$first或$last和文件名。像.append("fileName", new Document("$first","$fileName")这样的东西。如果要控制顺序,请在分组前使用排序阶段。 -
我不想要第一个文件名。我需要在输出中显示最大 fileId 的文件名
-
正如@Veeram 建议的那样,如果您将
$sort升序为fileId作为第二个管道步骤,然后在您的$group步骤中使用$last以获取fileName,您将具有与最大 fileId 关联的文件名。