在Spring包含数组的Spring中进行mongo查询

i_l*_*lit 8 spring spring-mvc mongodb

我使用spring和mongo进行API开发,具有以下文档结构:

Document-1
myId:1
array:['abc','jkl','xyz']

Document-2
myId:3
array:['qwe','mnp','xyz']

Document-3
myId:3
array:['ped','abc','xyz']

My url : localhost:8080/array=xyz
expected : document-1,document-2,document-3

My url: localhost:8080/array=xyz,abc
exoected: document-1,document-3
Run Code Online (Sandbox Code Playgroud)

简而言之,我希望结果中包含所有逗号分隔array变量的所有文档.

是否有类似@Query注释的Spring提供的内部支持?

或者我怎样才能实现这一目标?

chr*_*dam 6

您基本上想要使用$all运算符来获得所需的结果.在mongo shell中,以下操作将带来文件:

填充测试集合

db.test.insert([
    {
        _id: 1,
        myId: 1,
        array: ['abc','jkl','xyz']
    },
    {
        _id: 2,
        myId: 3,
        array: ['qwe','mnp','xyz']
    },
    {
        _id: 3,
        myId: 3,
        array:['ped','abc','xyz']
    }
])
Run Code Online (Sandbox Code Playgroud)

运行操作

> db.test.find({"array": { "$all": ["xyz"] }})
{ "_id" : 1, "myId" : 1, "array" : [ "abc", "jkl", "xyz" ] }
{ "_id" : 2, "myId" : 3, "array" : [ "qwe", "mnp", "xyz" ] }
{ "_id" : 3, "myId" : 3, "array" : [ "ped", "abc", "xyz" ] }

> db.test.find({"array": { "$all": ["abc", "xyz"] }})
{ "_id" : 1, "myId" : 1, "array" : [ "abc", "jkl", "xyz" ] }
{ "_id" : 3, "myId" : 3, "array" : [ "ped", "abc", "xyz" ] }
Run Code Online (Sandbox Code Playgroud)

@QuerySpring Data MongoDB中的注释一样,我没有测试过这个,但您可能想尝试以下自定义查询实现示例

@Document(collection="test")
class Test {
    int myId;
    String[] array;
}

public interface TestRepository extends MongoRepository<Test, Integer> {
    @Query(value = "{ 'array' : {$all : [?0] }}")
    public List<Test> findAnyOfTheseValues(String[] arrayValues);
}
Run Code Online (Sandbox Code Playgroud)

如果上述方法不适合您,您可能需要创建自定义界面和实现类来执行自定义查询.例如,创建一个名称附加自定义的接口:

public interface TestRepositoryCustom {
    public List<Test> findAnyOfTheseValues(String[] arrayValues); 
}
Run Code Online (Sandbox Code Playgroud)

修改TestRepository并添加TestRepositoryCustom要扩展的接口:

@Repository
public interface TestRepository extends TestRepositoryCustom, MongoRepository {

}
Run Code Online (Sandbox Code Playgroud)

创建实现类以实现TestRepositoryCustom接口中定义的方法.

public class TestRepositoryImpl implements TestRepositoryCustom {

    @Autowired
    MongoTemplate mongoTemplate;

    @Override
    public List<Test> findAnyOfTheseValues(String[] arrayValues) {
        return mongoTemplate.find(
            Query.query(Criteria.where("array").all(arrayValues)), Test.class);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,很好的答案,但是不区分大小写呢,有可能吗?+1 (2认同)