【问题标题】:MongoRepository Find List in ArrayMongoRepository 在数组中查找列表
【发布时间】:2017-11-27 22:02:20
【问题描述】:

我有一个看起来像这样的document

@Document
public @Data class Note {

    @Id
    private String noteId;
    private String owner;
    @TextIndexed
    private String name;
    @TextIndexed
    private String text;
    private List<String> tags;
    private LocalDate date;
}

我还使用spring data mongodbmongodb 数据存储进行操作。 我已经创建了界面

public interface NoteRepository extends MongoRepository<Note, String> {
    List<Note> findByTags(List<String> tags);
}

我存储的对象是这样的

[
    {
        "noteId": "594e4adc3bc5152218f933b4",
        "owner": "system",
        "name": "simple note",
        "text": "My text",
        "tags": [
            "tag1",
            "tag2",
            "tag3"
        ],
        "date": [
            1992,
            12,
            15
        ]
    }
]

但除非我不提供 tag1, tag2, tag3findByTags 方法的标签列表,否则它不会返回任何结果。例如tag1, tag2 什么都不返回等等等等。

我应该如何对这些标签进行搜索?使用一些TextCriteria

【问题讨论】:

    标签: mongodb spring-boot spring-data-mongodb


    【解决方案1】:

    这取决于您要提供什么。

    如果您只想要一个值,那么 MongoDB 不关心数据是否在数组中,而是会在所有条目中查找匹配项

    public interface NoteRepository extends MongoRepository<Note, String> {
        List<Note> findByTags(String tags);
    }
    

    如果您想要一个可变大小列表来比较可能匹配的“任何”,那么有一个keyword used by spring-mongo 会影响$in 操作:

    public interface NoteRepository extends MongoRepository<Note, String> {
        List<Note> findByTagsIn(List<String> tags);
    }
    

    所以第一个是你只希望"tag1" 匹配数据的地方。第二个将匹配List 之类的"tag1", "tag2",或者只要“至少一个”实际上存在于正在搜索的数组中。

    【讨论】:

    • 但是如果我有一个复合对象Tagidname,应该如何进行搜索?创建方法 - findByTagsNameIn?
    • @user1432980 不同的东西。您可能会使用@Query 或直接开始使用其他方法。 MongoRepository 实际上只适用于一般的 CRUD。最重要的是,这不是你问的问题。如果您有新问题,那么Ask a New Question
    猜你喜欢
    • 2019-09-16
    • 1970-01-01
    • 2020-11-29
    • 2021-11-08
    • 2023-03-15
    • 2017-12-23
    • 2012-05-17
    • 1970-01-01
    • 2022-11-01
    相关资源
    最近更新 更多