MongoDB Java:从数组中删除符合指定条件的子文档
解决MongoDB Document中删除指定子文档的问题
我来帮你补全代码,实现从ObjData数组中删除Order字段值为"54321"的子文档需求。这里默认你使用的是MongoDB Java驱动中的Document类,以下是完整的实现方案:
完整代码实现
import org.bson.Document; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; public class JsonDocumentProcessing { public static void main(String[] args) { // 原始JSON字符串 String tmp = "[ { \"ID\":\"12\", \"Date\":\"2018-02-02\", \"ObjData\":[ { \"Name\":\"AAA\", \"Order\":\"12345\", \"Extra1\":{ \"Temp\":\"3\" }, \"Extra2\":{ \"Temp\":\"5\" } }, { \"Name\":\"BBB\", \"Order\":\"54321\", \"Extra1\":{ \"Temp\":\"3\" }, \"Extra2\":{ \"Temp\":\"5\" } } ] } ]"; // 解析JSON为Document列表(原始JSON是数组格式) List<Document> docList = Document.parse(tmp); Document mainDoc = docList.get(0); // 获取ObjData对应的子文档列表 List<Document> objDataList = mainDoc.getList("ObjData", Document.class); // 方式1:传统遍历过滤 List<Document> filteredObjData = new ArrayList<>(); for (Document subDoc : objDataList) { String orderValue = subDoc.getString("Order"); if (!"54321".equals(orderValue)) { filteredObjData.add(subDoc); } } // 方式2:Java 8+ Stream API(更简洁) // List<Document> filteredObjData = objDataList.stream() // .filter(subDoc -> !"54321".equals(subDoc.getString("Order"))) // .collect(Collectors.toList()); // 将过滤后的新数组替换原ObjData字段 mainDoc.put("ObjData", filteredObjData); // 输出验证处理后的结果 System.out.println(mainDoc.toJson()); } }
关键步骤说明
- 解析JSON:你的原始JSON是数组格式,所以
Document.parse()会返回List<Document>,需要取出第一个元素作为主处理文档。 - 获取子数组:通过
getList("ObjData", Document.class)方法,直接把ObjData字段转换为Document类型的列表。 - 过滤目标子文档:可以选择传统遍历判断,也可以用Java 8的Stream API实现更简洁的过滤逻辑,核心都是排除
Order值为"54321"的子文档。 - 更新主文档:把过滤后的新列表重新赋值给主文档的
ObjData字段,完成修改。
如果你的MongoDB驱动版本较低,API可能略有差异,但核心逻辑一致——定位目标数组、过滤元素、替换原数组即可。
内容的提问来源于stack exchange,提问作者Erik L
相关产品推荐
相关产品推荐

