【发布时间】:2026-01-15 17:50:02
【问题描述】:
我有一个数据库对象,其中包含一个也是对象的字段,如下所示:
public class PrdVersionOverviewDbData {
public static final String FIELD_SPECIFICATION_ENTRY_POINTER = "specificiationEntryPointer";
@BsonProperty(FIELD_SPECIFICATION_ENTRY_POINTER)
private MongodbSpecificationEntryPointer specificiationEntryPointer;
[...]
}
现在,我有一个List<MongodbSpecificationEntryPointer>,我想查找所有PrdVersionOverviewDbData,其中specificiationEntryPointer 是列表中的任何一个。自发地,我尝试使用这样的in 过滤器来解决这个问题:
Bson filter = Filters.in(PrdVersionOverviewDbData.FIELD_SPECIFICATION_ENTRY_POINTER, specificiationEntryPointerList);
但是,出于某种奇怪的原因,运行该过滤器总是只返回一个空列表。
相比之下,下面的逻辑给了我想要的结果:
public List<PrdVersionOverviewDbData> readPrdVersionsContainingAnyOfSpecificationPointers(
List<MongodbSpecificationEntryPointer> specificationPointerList
) {
List<PrdVersionOverviewDbData> allPrdVersionOverviews = readObjectList();
List<PrdVersionOverviewDbData> prdVersionOverviewsContainingSpecificationPointer = new ArrayList<>();
for (PrdVersionOverviewDbData prdVersionOverviewDbData : allPrdVersionOverviews) {
if(prdVersionOverviewDbData.containsAny(specificationPointerList)) {
prdVersionOverviewsContainingSpecificationPointer.add(prdVersionOverviewDbData);
}
}
return prdVersionOverviewsContainingSpecificationPointer;
}
public class PrdVersionOverviewDbData{
public static final String FIELD_SPECIFICATION_ENTRY_POINTER = "specificiationEntryPointer";
@BsonProperty(FIELD_SPECIFICATION_ENTRY_POINTER)
private MongodbSpecificationEntryPointer specificiationEntryPointer;
[...]
public boolean containsAny(
List<MongodbSpecificationEntryPointer> specificationPointerList
) {
return specificationPointerList.contains(specificiationEntryPointer);
}
}
当然,这是非常低效的,因为它首先需要从 MongoDB 读取所有数据,然后对其进行迭代。所以我的问题是:我在过滤器上做错了什么?这样做的正确方法是什么?
【问题讨论】: