Java 在Mongo聚合中使用filePrefix分组时如何投影文件名
目前,我能够根据filePrefix进行分组,并获得具有max fileId的记录 在输出中,我能够获得filePrefix和fileId,但无法获得fileName以及filePrefix和fileId 有人能帮我解决这个问题吗 我的文件:Java 在Mongo聚合中使用filePrefix分组时如何投影文件名,java,mongodb,Java,Mongodb,目前,我能够根据filePrefix进行分组,并获得具有max fileId的记录 在输出中,我能够获得filePrefix和fileId,但无法获得fileName以及filePrefix和fileId 有人能帮我解决这个问题吗 我的文件: { “_id”:ObjectId(“58cbe224238b3953da3bc0bc”), “文件名”:“samplefile1_124.txt”, “文件前缀”:“samplefile1”, “文件ID”:124 } { “_id”:ObjectId(“
{
“_id”:ObjectId(“58cbe224238b3953da3bc0bc”),
“文件名”:“samplefile1_124.txt”,
“文件前缀”:“samplefile1”,
“文件ID”:124
}
{
“_id”:ObjectId(“58cbe257238b3953da3bc0bd”),
“文件名”:“samplefile2_125.txt”,
“文件前缀”:“samplefile2”,
“文件ID”:125
}
{
“_id”:ObjectId(“58cf8d13f731b796bc343726”),
“文件名”:“samplefile3_126.dat”,
“文件前缀”:“samplefile3”,
“文件ID”:126
}
{
“_id”:ObjectId(“58cfa525f731b796bc343727”),
“文件名”:“samplefile1_126.txt”,
“文件前缀”:“samplefile1”,
“文件ID”:126
}
{
“_id”:ObjectId(“58cfa525f731b796bc343728”),
“文件名”:“samplefile2_127.txt”,
“文件前缀”:“samplefile2”,
“文件ID”:127
}
我的代码:
MongoClient mongo=新的MongoClient(“localhost”,27017);
MongoDatabase db=mongo.getDatabase(“fileDB”);
MongoCollection col=db.getCollection(“fileStatus”);
List docsList=new ArrayList();
添加文档列表(“示例文件1”);
添加文档列表(“示例文件2”);
添加文档列表(“样本文件3”);
Set docsSet=new HashSet();
用于(字符串st:docsList){
文件集添加(st);
}
文档匹配=新文档(“$match”,新文档(“filePrefix”,新文档(“$in”,docsSet));
文档组=新文档(“$group”,新文档(“\u id”,“$filePrefix”)。追加(“fId”,新文档(“$max”,“$fileId”));
文档项目=新文档($project),新文档(“文件前缀”,“美元id”)。追加(“文件id”,“美元fId”);
AggregateItable输出=col.aggregate(Arrays.asList(匹配、组、项目));
for(文档dbObject:output)
{
System.out.println(dbObject);
}
我的输出:
文档{{{u id=samplefile1,filePrefix=samplefile1,fileId=126.0}文档{{{u id=samplefile2,filePrefix=samplefile2,fileId=127.0}
文档{{{u id=samplefile3,filePrefix=samplefile3,fileId=126.0}
如果要返回其他字段,则需要使用(如果按降序)或(如果按升序)操作符,因此需要运行以下聚合管道,在应用组操作之前首先对文档进行排序。本质上,这将为您提供max字段以及相应的文档字段 例如,使用示例文档作为输入
db.test.aggregate([
{ "$match": { "filePrefix": { "$in": docsSet } } },
{ "$sort": { "filePrefix": 1, "fileId": -1 } },
{
"$group": {
"_id": "$filePrefix",
"fileId": { "$first": "$fileId"},
"fileName": { "$first": "$fileName"}
}
}
])
i、 e.翻译为
Document match = new Document(
"$match", new Document("filePrefix",
new Document("$in", docsSet)
)
);
Document sort = new Document("$sort",
new Document("filePrefix", 1).append("fileId", -1)
);
Document group = new Document("$group" ,
new Document("_id", "$filePrefix")
.append("fileId", new Document("$first", "$fileId")
.append("fileName", new Document("$first", "$fileName")
)
);
Document project = new Document("$project",
new Document("filePrefix", "$_id")
.append("fileId", 1)
.append("fileName", 1)
);
如果要返回其他字段,则需要使用(如果按降序)或(如果按升序)操作符,因此需要运行以下聚合管道,在应用组操作之前首先对文档进行排序。本质上,这将为您提供max字段以及相应的文档字段 例如,使用示例文档作为输入
db.test.aggregate([
{ "$match": { "filePrefix": { "$in": docsSet } } },
{ "$sort": { "filePrefix": 1, "fileId": -1 } },
{
"$group": {
"_id": "$filePrefix",
"fileId": { "$first": "$fileId"},
"fileName": { "$first": "$fileName"}
}
}
])
i、 e.翻译为
Document match = new Document(
"$match", new Document("filePrefix",
new Document("$in", docsSet)
)
);
Document sort = new Document("$sort",
new Document("filePrefix", 1).append("fileId", -1)
);
Document group = new Document("$group" ,
new Document("_id", "$filePrefix")
.append("fileId", new Document("$first", "$fileId")
.append("fileName", new Document("$first", "$fileName")
)
);
Document project = new Document("$project",
new Document("filePrefix", "$_id")
.append("fileId", 1)
.append("fileName", 1)
);
在group stage中对文件名使用
$first
或$last
。类似于.append(“fileName”,新文档(“$first”,“$fileName”)
。如果您想控制顺序,请使用组前排序阶段。我不想要第一个文件名。我需要在输出中显示最大文件ID的文件名,正如@Veeram建议的那样,如果您将$sort
按文件ID
升序作为第二个管道步骤,然后在$group
步骤中使用$last
,以获得$first
或$last
一起使用。类似于.append(“文件名”),新文档($first),“$fileName”)
。如果您想控制顺序,请使用组前排序阶段。我不想要第一个文件名。我需要在输出中显示最大文件ID的文件名,正如@Veeram建议的那样,如果您将$sort
按文件ID
升序作为第二个管道步骤,然后在$group
步骤中使用$last
,以获得