spring数据,mongodb如何从文档数组中获取嵌套对象(非文档)

vql8enpb  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(483)

mongo文档“历史”:

@Document(collection = "histories")
@Data
public class History {
    @Id
    private String id;

    @Transient
    private final String name = MAIN_FOLDER;
    private String appleId;
    private ArrayList<Item> historyItems = new ArrayList<>();
    private ArrayList<Folder> historyFolders = new ArrayList<>();
}

文件夹型号:

@Data
public class Folder {
    private String name;
    private LocalDateTime date;
    private ArrayList<Item> historyItem = new ArrayList<>();
}

查询条件:

public Folder findFolderByName(final String name) {
        Query query = new Query();
        query.addCriteria(Criteria.where("historyFolders.name").is(name));
        return template.findOne(query, Folder.class);
    }

我从这个查询中得到空值。很抱歉,我是新技术,我没有找到有关文档化数组的标准的信息。

zbq4xfa0

zbq4xfa01#

您在错误的集合中执行查询。 Folder 不是集合,而只是“histories”集合中的嵌套文档。
而且:不能只返回执行“classic”查询的嵌套文档。您必须在客户端(java代码)对其进行过滤,使用$elemmatch filter并在客户端展开,或者为此使用聚合管道。看看这个问题:如果在查询/管道中需要这个,有很多解决方案。
您的查询看起来是正确的。只需更新查询执行即可使用 History 实体而不是 Folder 实体。

public History findFolderByName(final String name) {
    Query query = new Query();
    query.addCriteria(Criteria.where("historyFolders.name").is(name));
    return template.findOne(query, History.class);
}

如果您经常使用此查询并且集合中有大量文档:请考虑在上创建索引 historyFolders.name

相关问题