繁体   English   中英

春季数据,MongoDB。 如何从文档的数组中获取嵌套对象(非文档)

[英]Spring Data, MongoDB. How to get nested object (non-document) from document's array

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);
    }

我从这个查询中得到了 Null。 抱歉,我是这项技术的新手,我没有找到有关已记录数组的标准的信息。

您正在错误的集合中执行查询。 Folder不是集合,而只是“历史”集合中的嵌套文档。

而且:您不能只返回带有“经典”查询执行的嵌套文档。 您必须在客户端(您的 Java 代码)过滤它,使用投影 $elemMatch过滤器并在客户端展开或为此使用聚合管道。 看看这个问题:如果您在查询/管道中需要这个,有很多解决方案

您的查询看起来正确。 您只需更新查询执行即可使用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上创建一个索引

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM