【问题标题】:mongodb query with spring data for key-value带有弹簧数据的mongodb查询键值
【发布时间】:2016-04-22 12:16:48
【问题描述】:

我已经开始使用 mongodb 和 spring boot 和 spring JPA 数据进行项目,我意识到我无法将我的数据模型映射到实体并轻松地对其进行查询,所以我有两个问题,

我的数据模型是这样的(只针对一个 Collection)

{
   name: "Name",
   lastName: "Last Name",
   attributes: {
      age: 25
      eye: {
         color: "RED",
         size: "BIG"
      }
   }
}

我的实体是

@Entity // or @Document
public class User{
   private String name;
   private String lastName;
   private Map<String, ?> attributes = new HashMap<>();

   // id or the setter getter are omitted
}
  1. 我可以像以前那样在我的 mongodb 集合中映射 attributes 属性吗 (Map)
  2. 如何查询属性?

    我可以那样做吗? List&lt;User&gt; findAllByAttributesAge(Integer age);

【问题讨论】:

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


    【解决方案1】:

    今天我在 Spring Mongodb 中遇到了 Map 查询问题,由于这个问题在 google 中弹出第一个问题,我将提供另一个答案。

    由于其他答案引用了文档,并且该文档没有很多信息,我将举一个例子来说明动态模式的 @Query 注释有多好:

    @Query(value = "{'attributes.age' : ?0}")
    List<User> findAllByAttributesAge(int age);
    

    另外,你也可以查询眼睛颜色:

    @Query(value = "{'attributes.eye.color' : ?0}")
    List<User> findAllByAttributesEyeColor(String color);
    

    正如其他答案文档所说,您可以过滤结果,并仅接收您喜欢的文档部分:

    // It will return the users with only name and last name
    @Query(value = "{'attributes.age' : ?0}", fields = "{ name : 1, lastName : 1 }")
    List<User> findAllByAttributesAge(int age);
    

    【讨论】:

      【解决方案2】:

      我可以像以前那样在我的 mongodb 集合中映射 attributes 属性吗( Map )

      是的,您可以,而且对于“dynamic”或“partly defined”架构可能会很有用(尽管很棘手)。

      如果您事先知道您的架构,我强烈建议您将其显示在您的域对象中。看看here

      如何查询属性?

      如果不使用动态架构,嵌套属性的属性遍历在Spring Data MongoDB Reference Documentation 中有明确说明。

      如果您使用动态架构,您很可能会使用MongoDB JSON based query methods

      【讨论】:

      • 我在某些实体中有动态模式,但我不想使用像 @Query 注释这样的自定义查询,我需要知道是否可以使用约定进行查询?如果是的话怎么办? @MarcTarin
      • 我向您指出的文档以“属性表达式只能引用托管实体的直接属性”开头,所以不,您不能只声明在嵌套属性上定义 findBy 查询如果Spring 不知道它的存在。
      猜你喜欢
      • 2017-05-21
      • 1970-01-01
      • 2012-08-03
      • 1970-01-01
      • 2018-02-03
      • 1970-01-01
      • 1970-01-01
      • 2019-03-13
      • 1970-01-01
      相关资源
      最近更新 更多