【问题标题】:Spring Data, MongoDB. How to get nested object (non-document) from document's array弹簧数据,MongoDB。如何从文档的数组中获取嵌套对象(非文档)
【发布时间】:2021-02-28 04:19:30
【问题描述】:

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。抱歉,我是这项技术的新手,我没有找到有关文档数组标准的信息。

【问题讨论】:

    标签: java spring mongodb spring-data criteria


    【解决方案1】:

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

    此外:您不能只返回具有“经典”查询执行的嵌套文档。您必须在客户端(您的 java 代码)过滤它,使用 projections $elemMatch 过滤器并在客户端展开或为此使用聚合管道。 Look at this Question: there are a lot of solutions if you need this in a query/pipeline.

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

    【讨论】:

    • 嘿。感谢您的回答。关键是,如果你这样写:template.findOne(query, History.class);,你的return 等待历史记录,而不是文件夹。我想从此文档中获取文件夹模型
    • 刚刚更新了答案。抱歉,我首先没有看到您想要文件夹而不是历史模型。
    • 是的,我理解你。但我的想法是获取“项目”本身,而不是该项目的“历史”。
    • 是的,正如您在更新的答案中看到的那样:这仅适用于客户端过滤,使用投影过滤,然后展开客户端或使用聚合管道。您可以将所有选项与 spring-data 和 mongodb 一起使用。
    猜你喜欢
    • 2018-06-03
    • 2023-03-05
    • 2020-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-28
    • 1970-01-01
    相关资源
    最近更新 更多