MongoDB查询使用$exists和$elemMatch不起作用。

huangapple go评论87阅读模式
英文:

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&lt;Foo, String&gt; {

	@Query(&quot;{ &#39;example&#39; : { $exists : true }, &#39;example.str1&#39; : { $regex: ?0 } }&quot;)
	List&lt;Foo&gt; findByExamplePropertyRegex(String regexStr);
}

Sample four documents in foo collection:

{ &quot;example&quot; : { &quot;str1&quot; : &quot;apple&quot;, &quot;str2&quot; : &quot;rose&quot; } },
{ &quot;example&quot; : { &quot;str1&quot; : &quot;pineapple&quot;, &quot;str2&quot; : &quot;jasmine&quot; } },
{ &quot;other&quot;: &quot;stuff&quot; },
{ &quot;example&quot; : null }

Run the query from Spring Boot application using CommandLineRunner:

@Autowired
private FooRepo repo;

// ...
public void run(String... strings) throws Exception {
    String regexStr = &quot;apple&quot;; // -or- &quot;in&quot;
    List&lt;Foo&gt; 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.

huangapple
  • 本文由 发表于 2020年4月8日 19:01:26
  • 转载请务必保留本文链接:https://go.coder-hub.com/61099144.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定