任务描述 本关任务:根据编程要求,完成任务。 编程要求 打开右侧代码文件窗口,在 Begin 至 End 区域补充代码,完成任务。 当前已经在 MongoDB 中创建了 school 库,并在其中创建了 student 集合,用 MongoDB 的 Java 客户端编程,获取 name 姓名为 lisi 同学的 English、Math、Computer 成绩信息( score 列),结果为整数。 输出示例如下: 英语:xx 数学:xx 计算机:xx MongoDB 服务器地址:mongodb://localhost:27017import com.mongodb.MongoClient; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoCursor; import com.mongodb.client.MongoDatabase; import org.bson.Document; /*************** Begin ***************/ public class MongoDBUtils { public static void main(String[] args) { // 连接到MongoDB服务器 // 连接到school数据库 // 获取student集合 // 构建查询条件 // 查询并输出结果 // 关闭MongoDB连接 } } /*************** End ***************/再写出实验环境代码
时间: 2025-06-30 21:14:13 浏览: 10
<think>我们参考引用[1]和引用[2]的内容,用户需要查询的是名为"lisi"的学生成绩,成绩包括English,Math,Computer三个字段。引用[1]中展示的数据结构是:文档中有一个"score"字段,它是一个内嵌文档,包含三个科目成绩。引用[2]中展示的集合操作是在student集合中,字段名为"sname"和"sage",但用户现在要查询的是"name"字段(根据引用[1]中的结构)还是引用[2]中的"sname"?但是用户的问题描述中明确要求:查询school数据库中student集合,条件为name=lisi,并且输出English,Math,Computerscore字段。注意:引用[1]中的示例文档结构是:{"name":"scofield","score":{"English":45,"Math":89,"Computer":100}}而引用[2]中展示的文档结构是:{"sname":"lisi","sage":20}用户的问题中要求查询的是name=lisi,但引用[2]中实际使用的是sname字段。因此我们需要明确:用户希望查询的字段名是"name"还是"sname"?然而,用户的问题描述中同时出现了两种结构。考虑到用户上一次的问题中引用了这两个结构,但当前问题要求的是按照引用[1]中的成绩结构(即成绩在score内嵌文档中)来查询,并且引用[2]中更新的是sage字段(年龄)而不是成绩。所以,我们假设用户当前的数据结构是引用[1]中的结构,即:-有一个"name"字段(而不是sname)存储学生姓名-有一个"score"字段,它是一个内嵌文档,包含English,Math,Computer等科目成绩。因此,我们将按照以下步骤操作:1.连接MongoDB(localhost默认端口27017)2.选择数据库school和集合student3.构建查询条件:name等于"lisi"4.查询并获取结果文档5.从结果文档中提取score内嵌文档中的各个科目成绩如果用户的实际数据结构是引用[2]中的(即使用sname字段),那么我们需要将查询条件改为"sname"。但是用户问题中明确要求的是"name"字段(问题描述:查询条件为name=lisi)。因此我们按照用户描述的条件字段为"name"。但是,请注意引用[2]中更新操作使用的是sname字段。为了确保代码的健壮性,我们可以先查看用户的数据结构,但这里用户没有提供,所以按照问题描述为准。我们编写代码时,将使用"name"作为查询条件的字段名,并假设成绩信息存储在"score"字段的内嵌文档中。如果实际数据结构不同,用户可能需要调整字段名。代码实现:</think>### 使用 Java API 查询 MongoDB 学生成绩
根据您的需求,以下是使用 MongoDB Java API 查询 `lisi` 成绩的完整解决方案:
#### 1. 环境配置
- **MongoDB 版本**: 5.0+
- **Java 环境**: JDK 11+
- **Maven 依赖**:
```xml
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver-sync</artifactId>
<version>4.9.0</version>
</dependency>
```
---
#### 2. Java 查询代码
```java
import com.mongodb.client.*;
import org.bson.Document;
import static com.mongodb.client.model.Filters.eq;
public class StudentScoreQuery {
public static void main(String[] args) {
// 1. 连接 MongoDB 数据库
String connectionString = "mongodb://localhost:27017";
try (MongoClient client = MongoClients.create(connectionString)) {
// 2. 选择数据库和集合
MongoDatabase db = client.getDatabase("school");
MongoCollection<Document> collection = db.getCollection("student");
// 3. 查询 name=lisi 的学生文档
Document studentDoc = collection.find(eq("name", "lisi")).first();
if (studentDoc != null) {
// 4. 提取成绩信息
Document scoreDoc = studentDoc.get("score", Document.class);
// 5. 输出成绩结果
System.out.println("学生姓名: " + studentDoc.getString("name"));
System.out.println("英语成绩: " + scoreDoc.getInteger("English"));
System.out.println("数学成绩: " + scoreDoc.getInteger("Math"));
System.out.println("计算机成绩: " + scoreDoc.getInteger("Computer"));
} else {
System.out.println("未找到学生 lisi 的成绩记录");
}
} catch (Exception e) {
System.err.println("数据库连接错误: " + e.getMessage());
}
}
}
```
---
#### 3. 关键步骤说明
1. **连接数据库**:
- 使用 `MongoClients.create()` 建立到 `localhost:27017` 的连接[^1]
2. **选择集合**:
- 定位到 `school` 数据库的 `student` 集合
3. **构建查询**:
- `eq("name", "lisi")` 创建精确匹配查询条件
- `.first()` 获取第一条匹配记录
4. **提取成绩**:
- `get("score", Document.class)` 获取内嵌的成绩文档[^1]
5. **输出结果**:
- 分别提取 English/Math/Computer 成绩字段
---
#### 4. 预期输出示例
如果数据库中存在以下文档:
```json
{
"name": "lisi",
"score": {
"English": 85,
"Math": 92,
"Computer": 78
}
}
```
程序将输出:
```
学生姓名: lisi
英语成绩: 85
数学成绩: 92
计算机成绩: 78
```
---
### 常见问题解决
1. **连接失败**:
- 检查 MongoDB 服务是否运行:`sudo systemctl status mongod`
- 验证防火墙设置:`sudo ufw allow 27017`
2. **字段不存在**:
- 使用 `containsKey()` 检查字段存在性:
```java
if (scoreDoc.containsKey("English")) {
System.out.println("英语成绩: " + scoreDoc.getInteger("English"));
}
```
3. **数据类型转换**:
- 成绩值可能是 `Double` 类型,使用 `getDouble()` 替代 `getInteger()`
---
### 相关问题
1. 如何实现多条件查询(如同时筛选班级和科目成绩)?
2. MongoDB 的聚合管道($project/$match)如何替代 Java 中的数据处理?
3. 如何优化大数据量下的成绩查询性能?
4. 使用 Spring Data MongoDB 实现相同功能的简化方法是什么?
5. 如何将查询结果导出为 CSV/Excel 格式文件?
[^1]: 引用自 MongoDB 文档结构
[^2]: 引用自 MongoDB Shell 操作示例
阅读全文
相关推荐



















