gpt4 book ai didi

java - 当我们在 Mongo 聚合中与 filePrefix 分组时如何投影 fileName

转载 作者:太空宇宙 更新时间:2023-11-04 11:39:55 25 4
gpt4 key购买 nike

目前我可以根据 filePrefix 进行分组并获取具有最大 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);
}

我的输出:

Document{{_id=samplefile1, filePrefix=samplefile1, fileId=126.0}}
Document{{_id=samplefile2, filePrefix=samplefile2, fileId=127.0}}
Document{{_id=samplefile3, filePrefix=samplefile3, fileId=126.0}}

最佳答案

您需要运行以下聚合管道,该管道在应用组操作之前首先对文档进行排序,因为您需要使用 $first (如果按降序排列)或 $last如果您希望返回其他字段,请使用 (如果按升序)运算符。这实质上将为您提供最大字段以及相应的文档字段。

例如使用示例文档作为输入

db.test.aggregate([
{ "$match": { "filePrefix": { "$in": docsSet } } },
{ "$sort": { "filePrefix": 1, "fileId": -1 } },
{
"$group": {
"_id": "$filePrefix",
"fileId": { "$first": "$fileId"},
"fileName": { "$first": "$fileName"}
}
}
])

即翻译为

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)
);

关于java - 当我们在 Mongo 聚合中与 filePrefix 分组时如何投影 fileName,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42923548/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com