升级MongoDB5后Morphia的datastore.find()无结果但aggregate正常的原因
以下是几种可能导致该现象的原因及对应的排查点:
实体映射配置不匹配
检查Event类的@Entity注解:Morphia 2.x默认会将类名转换为小写复数形式作为集合名(例如Event对应events),如果实际存储数据的集合名称和这个默认值不一致,datastore.find(Event.class)会查询错误的集合,而aggregate因为手动指定了正确集合所以能查到数据。另外,若实体使用了@Discriminator注解,保存时未正确写入鉴别器字段,或查询时鉴别器配置和写入时不一致,find()会自动添加鉴别器过滤条件,导致结果为空,而aggregate不会处理鉴别器逻辑。Datastore映射包未正确配置
确认初始化Datastore时是否调用了mapper.mapPackage()指定Event类所在的包。如果实体类未被Morphia映射,find()无法正确解析实体与集合的关联关系,自然查不到数据,但aggregate直接操作MongoDB集合,不受映射配置影响。内存Mongo的元数据同步问题
部分内存Mongo服务器(如MongoDB Memory Server)在集合元数据处理上和真实MongoDB有差异,datastore.save()可能没有同步更新集合的元数据,导致Morphia的查询无法识别集合的存在。可以尝试手动创建集合后再执行保存和查询,或者调用datastore.ensureIndexes(Event.class)触发元数据同步。隐式过滤条件的影响
检查Event类是否配置了全局过滤规则(比如逻辑删除字段的自动过滤),Morphia的find()会自动应用这些规则,而aggregate不会。例如如果实体有@Field("is_deleted") private boolean isDeleted,且在Datastore配置中添加了全局过滤datastore.find(Event.class).filter("isDeleted", false)的默认条件,而保存的数据中isDeleted字段未正确设置,就会导致find()返回空,但aggregate能查到原始数据。
内容的提问来源于stack exchange,提问作者Ankit Chand

