使用Reactive-Streams检查MongoDB文档是否存在遇类型转换问题
MongoDB检查文档存在失败:Publisher类型转换错误解决方案
你遇到的问题根源是使用了MongoDB Reactive Streams异步驱动,而非同步驱动。Reactive驱动的所有操作都返回Publisher类型(比如Mono/Flux),不能像同步驱动那样直接赋值给Document或long,这就是你看到类型转换错误的原因。下面是两种方案的修正版:
方案1:修正findOne()逻辑
Reactive版本的find(...).first()返回Mono<Document>,需要通过block()方法阻塞获取同步结果(适合简单场景),或者用异步订阅方式处理:
阻塞方式(简单场景)
Document d = collection.find(eq("UUID", id)).first().block(); if (d == null) { System.out.println("document = null"); return; } System.out.println("document exists");
异步非阻塞方式(Reactive场景推荐)
collection.find(eq("UUID", id)).first() .subscribe(doc -> { if (doc == null) { System.out.println("document = null"); } else { System.out.println("document exists"); } });
方案2:修正countDocuments()逻辑
Reactive版本的countDocuments()返回Mono<Long>,同样需要block()获取数值,同时注意原代码的逻辑反转问题:
Long count = collection.countDocuments(query).block(); if (count < 1) { System.out.println("Document does NOT exist"); } else { System.out.println("Document exists"); }
额外提示
如果你的项目本应使用同步驱动,检查Maven/Gradle依赖是否引入错误:
- 同步驱动依赖:
org.mongodb:mongodb-driver-sync - Reactive驱动依赖:
org.mongodb:mongodb-driver-reactivestreams
内容的提问来源于stack exchange,提问作者Jackolix
相关产品推荐
相关产品推荐

