使用Spring数据MongoDB从MongoDB中的嵌入式数组中查找包含元素子列表的实体

使用Spring数据MongoDB从MongoDB中的嵌入式数组中查找包含元素子列表的实体,mongodb,spring-boot,spring-data,spring-data-mongodb,Mongodb,Spring Boot,Spring Data,Spring Data Mongodb,我有一个MongoDB实体,它有一个标签列表: @Document @TypeAlias("project") data class Project(@Id var id: String?, val name: String, val tags: MutableList<Tag>) 如果我按以下方式定义存储库: interface ProjectRepository : ReactiveCrudReposi

我有一个MongoDB实体,它有一个标签列表:

@Document
@TypeAlias("project")
data class Project(@Id var id: String?,
                   val name: String,
                   val tags: MutableList<Tag>)
如果我按以下方式定义存储库:

interface ProjectRepository : ReactiveCrudRepository<Project, String> {
    fun findByTags(tags : List<Tag>): Flux<Project>
}
它只能传递列表的完整内容(标签(“区域”、“It”)、标签(“部门”、“架构”):


如何查询包含列表子集的实体?

使用
标准和
$elemMatch
运算符解决:

interface CustomProjectRepository {
    fun findByTags(tags: List<Tag>): Flux<Project>
}

class CustomProjectRepositoryImpl(private val mongoTemplate: ReactiveMongoTemplate) : CustomProjectRepository {
    override fun findByTags(tags: List<Tag>): Flux<Project> {
        val query = Query()
        val criterias = mutableListOf<Criteria>()
        tags.forEach {
            criterias.add(Criteria.where("tags").elemMatch(Criteria.where("key").`is`(it.key).and("value").`is`(it.value)))
        }
        query.addCriteria(Criteria().andOperator(* criterias.toTypedArray()))
        return mongoTemplate.find(query, Project::class.java)
    }
}

interface ProjectRepository : ReactiveCrudRepository<Project, String>, CustomProjectRepository {

    fun findByClientIdAndId(clientId: String, id: String): Mono<Project>
    fun findByClientId(clientId: String): Flux<Project>
}

接口自定义项目存储库{
有趣的findByTags(标签:列表):Flux
}
类CustomProjectRepositoryImpl(私有val mongoTemplate:ReactiveMongoTemplate):CustomProjectRepository{
覆盖有趣的findByTags(标记:List):Flux{
val query=query()
val criterias=mutableListOf()
弗雷赫酒店{
add(criterias.where(“tags”).elemMatch(Criteria.where(“key”)`is`(it.key).和(“value”)`is`(it.value)))
}
query.addCriteria(Criteria().andOperator(*criterias.toTypedArray()))
返回mongoTemplate.find(查询,项目::class.java)
}
}
接口项目存储库:ReactiveCrudepository、CustomProjectRepository{
有趣的findByClientIdAndId(clientId:String,id:String):Mono
fun findByClientId(clientId:String):Flux
}
{"find": "project", "filter": {"tags": [{"key": "area", "value": "IT"}]}
{"find": "project", "filter": {"tags": [{"key": "area", "value": "IT"},{"key": "department", "value": "Architecture"}]}
interface CustomProjectRepository {
    fun findByTags(tags: List<Tag>): Flux<Project>
}

class CustomProjectRepositoryImpl(private val mongoTemplate: ReactiveMongoTemplate) : CustomProjectRepository {
    override fun findByTags(tags: List<Tag>): Flux<Project> {
        val query = Query()
        val criterias = mutableListOf<Criteria>()
        tags.forEach {
            criterias.add(Criteria.where("tags").elemMatch(Criteria.where("key").`is`(it.key).and("value").`is`(it.value)))
        }
        query.addCriteria(Criteria().andOperator(* criterias.toTypedArray()))
        return mongoTemplate.find(query, Project::class.java)
    }
}

interface ProjectRepository : ReactiveCrudRepository<Project, String>, CustomProjectRepository {

    fun findByClientIdAndId(clientId: String, id: String): Mono<Project>
    fun findByClientId(clientId: String): Flux<Project>
}