英文:
MongoDB query with $exists and $elemMatch doesn't work
问题
例如,我有Java对象:
public class Foo {
private Example example;
}
public class Example {
private String str1;
private String str2;
}
字段 example 可能为null。
我需要获取所有 Foo 对象,其中 str1 包含例如 "text"。根据 文档,我尝试了以下代码:
@Query(value = "{ 'example' : { $exists : true, $elemMatch : { str1 : { $regex: '.*?0.*'} } } }")
但它返回了空的页面。
英文:
E.g. I have Java objects:
public class Foo {
private Example example;
}
public class Example {
private String str1;
private String str2;
}
Field example can be null.
I need to get all Foo objects where str1 contains e.g. "text". According to documentation I tried:
@Query(value = "{ 'example' : { $exists : true, $elemMatch : { str1 : { $regex: '.*?0.*'} } } }")
but it returns empty Page.
答案1
得分: 0
定义存储库中的查询:
@Repository
public interface FooRepo extends MongoRepository<Foo, String> {
@Query("{ 'example' : { $exists : true }, 'example.str1' : { $regex: ?0 } }")
List<Foo> findByExamplePropertyRegex(String regexStr);
}
在 foo
集合中示例的四个文档:
{ "example" : { "str1" : "apple", "str2" : "rose" } },
{ "example" : { "str1" : "pineapple", "str2" : "jasmine" } },
{ "other": "stuff" },
{ "example" : null }
从 Spring Boot 应用程序中使用 CommandLineRunner
运行查询:
@Autowired
private FooRepo repo;
// ...
public void run(String... strings) throws Exception {
String regexStr = "apple"; // -or- "in"
List<Foo> list = repo.findByExamplePropertyRegex(regexStr);
list.forEach(System.out::println);
}
输出将是两个文档,其 regexStr
为 "apple",以及一个具有输入 "in" 的文档。
另请参见:$regex 运算符。
英文:
Define the query in the repository:
@Repository
public interface FooRepo extends MongoRepository<Foo, String> {
@Query("{ 'example' : { $exists : true }, 'example.str1' : { $regex: ?0 } }")
List<Foo> findByExamplePropertyRegex(String regexStr);
}
Sample four documents in foo
collection:
{ "example" : { "str1" : "apple", "str2" : "rose" } },
{ "example" : { "str1" : "pineapple", "str2" : "jasmine" } },
{ "other": "stuff" },
{ "example" : null }
Run the query from Spring Boot application using CommandLineRunner
:
@Autowired
private FooRepo repo;
// ...
public void run(String... strings) throws Exception {
String regexStr = "apple"; // -or- "in"
List<Foo> list = repo.findByExamplePropertyRegex(regexStr);
list.forEach(System.out::println);
The output will be two documents with the regexStr
is "apple", and one document with input "in".
Also, see: $regex operator.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论