mongodb 查询带有键值的弹簧数据

nav*_*_gh 5 java spring mongodb spring-data-mongodb spring-boot

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

我的数据模型就是这样(仅用于一个集合)

{
   name: "Name",
   lastName: "Last Name",
   attributes: {
      age: 25
      eye: {
         color: "RED",
         size: "BIG"
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

我的实体是

@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
}
Run Code Online (Sandbox Code Playgroud)
  1. 我可以像我一样在我的 mongodb 集合中映射属性属性吗 ( Map )
  2. 如何查询以查找属性?

    我可以这样做吗? List<User> findAllByAttributesAge(Integer age);

Nok*_*oki 7

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

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

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

此外,您也可以查询眼睛颜色:

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

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

// 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);
Run Code Online (Sandbox Code Playgroud)


Mar*_*rin 3

我可以像我一样在 mongodb 集合中映射 attribute 属性吗( Map )

是的,你可以,而且它对于“动态”或“部分定义”模式可能很有用(尽管很棘手)。

如果您提前知道您的架构,我强烈建议它显示在您的域对象中。看看这里

如何进行查询以查找属性?

如果您不使用动态模式,则Spring Data MongoDB 参考文档中清楚地解释了嵌套属性的属性遍历。

如果您使用动态模式,您很可能会使用基于 MongoDB JSON 的查询方法