MongoDB报 $or/$and/$nor entries need to be full objects,不一定是服务端逻辑有问题。先检查发过去的BSON:$or数组需要条件对象,Java集合长度正确,也可能装着两个null。

new了对象,add收到的却是put返回值

2020年的代码是:

BasicDBList orList = new BasicDBList();
orList.add(new BasicDBObject().put("userGroup", userGroup));
orList.add(new BasicDBObject().put("userGroup", null));
condition.put("$or", orList);

这里 add 接收整个 put(...) 表达式的结果。put是Map式更新,返回该键之前的值,不是返回当前BasicDBObject;新对象没有旧值,于是两个元素都是null。MongoDB Java Driver 3.12 BasicDBObject API、Java Map.put契约

错误结构可表示为:

{"$or": [null, null]}

对象创建成功与表达式返回对象,是不同的判断。

让数组里保存完整条件对象

旧API写法可以用带键值的构造函数:

BasicDBList orList = new BasicDBList();
orList.add(new BasicDBObject("userGroup", userGroup));
orList.add(new BasicDBObject("userGroup", null));
BasicDBObject condition = new BasicDBObject("$or", orList);

假设userGroup为示例字符串team-a,对应条件结构是:

{"$or": [{"userGroup": "team-a"}, {"userGroup": null}]}

使用支持Filters构建器的驱动,也可以表达为:

Bson condition = Filters.or(
    Filters.eq("userGroup", userGroup),
    Filters.eq("userGroup", null)
);

两种形式择一即可,不要混用变量声明;示例中的userGroup应先确认是期望的非null业务值。

查询null,还包含字段缺失的情况

{"userGroup": null} 不只表示“存在且值为null”,也会匹配缺失该字段的文档。若业务需要严格区分,可按数据模型结合 $exists 或 $type;例如要求存在且等于null,应同时约束存在性。MongoDB空值与缺失字段说明

调试顺序是先看数组元素的实际类型,再看序列化后的BSON,最后核对条件语义。不要因为调试器显示列表size为2,就跳过内容检查。