MongoDB嵌套文档breaktime字段求和的Java实现求助
Java实现MongoDB嵌套数组breaktime字段求和
Hey there! 作为MongoDB和Java的新手,这个需求其实很好拆解——咱们要做的就是从users90集合里取出文档,遍历每个文档的break数组,把每个breaktime(比如"0:40")转换成可计算的分钟数累加,最后再转回"小时:分钟"的格式就行。下面分步骤来实现:
第一步:先明确你的数据结构
你的示例文档结构是这样的:
{ "_id" : ObjectId("5ad5f2e2f58a542f7989e8fc"), "date" : "2018-04-17", "break" : [ { "out" : "18:00", "in" : "18:40", "breaktime" : "0:40" }, { "out" : "19:00", "in" : "19:30", "breaktime" : "0:30" } ] }
我们的核心目标就是提取每个文档里break数组中的breaktime字段,然后做累加计算。
第二步:Java代码完整实现
这里假设你已经配置好了MongoDB Java同步驱动(如果还没配置,直接在Maven/Gradle里加对应依赖就行),下面是可直接运行的代码:
先导入必要的包
import com.mongodb.client.MongoClients; import com.mongodb.client.MongoClient; import com.mongodb.client.MongoDatabase; import com.mongodb.client.MongoCollection; import org.bson.Document; import java.util.List; import static com.mongodb.client.model.Filters.eq; // 如果要查单个文档需要这个
核心逻辑代码
public class BreakTimeSumCalculator { public static void main(String[] args) { // 连接MongoDB(本地默认端口,有认证/远程的话修改连接字符串即可) try (MongoClient mongoClient = MongoClients.create("mongodb://localhost:27017")) { // 替换成你的数据库名和集合名 MongoDatabase database = mongoClient.getDatabase("your_db_name"); MongoCollection<Document> collection = database.getCollection("users90"); // 遍历集合中所有文档(如果要查单个文档,把find()换成find(eq("_id", new ObjectId("你的文档ID")))) for (Document doc : collection.find()) { String date = doc.getString("date"); List<Document> breakRecords = doc.getList("break", Document.class); int totalMinutes = 0; // 逐个处理break数组里的每个休息记录 for (Document breakRecord : breakRecords) { String breakTimeStr = breakRecord.getString("breaktime"); // 把"0:40"拆成小时和分钟,转成总分钟数 String[] timeParts = breakTimeStr.split(":"); int hours = Integer.parseInt(timeParts[0]); int minutes = Integer.parseInt(timeParts[1]); totalMinutes += hours * 60 + minutes; } // 把总分钟数转回"小时:分钟"格式(比如70分钟就显示0:70) int totalHours = totalMinutes / 60; int remainingMinutes = totalMinutes % 60; String totalBreakTime = totalHours + ":" + remainingMinutes; // 打印结果 System.out.printf("日期: %s,总休息时长: %s%n", date, totalBreakTime); } } catch (Exception e) { e.printStackTrace(); } } }
几个关键细节提醒
- 格式转换逻辑:特意保留了你要的"0:70"这种格式,没有自动把70分钟转成1:10,如果需要转换的话,调整最后一步的计算逻辑就行。
- 资源管理:用了try-with-resources语法,会自动关闭MongoClient,避免资源泄漏。
- 灵活查询:如果不需要遍历所有文档,只查单个,用
eq过滤器指定_id即可,代码里已经加了注释提示。
内容的提问来源于stack exchange,提问作者Mohan
相关产品推荐
相关产品推荐

