mongodb查询与spring数据的键值

jutyujz0  于 2022-11-21  发布在  Spring
关注(0)|答案(3)|浏览(138)

我已经开始了一个使用mongodb、 Boot 和springJPA数据的项目,我意识到我无法将数据模型Map到实体,也无法轻松地对其进行查询,因此我有两个问题:
我的数据模型是这样的(仅适用于一个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集合中Map属性吗(Map)
1.如何查询属性?
我可以这样做吗?

ee7vknir

ee7vknir1#

今天我在Spring Mongodb中遇到了一个Map查询问题,由于这个问题是谷歌中的第一个问题,我将提供另一个答案。
由于另一个答案引用了文档,而文档中没有很多信息,因此我将举一个例子来说明动态模式的@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);
ao218c7q

ao218c7q2#

我可以像以前那样在我的mongodb集合中Map属性吗(Map)
是的,您可以这样做,而且它可能证明对“dynamic“或“partly defined“模式有用(尽管很棘手)。
如果您事先知道您的模式,我强烈建议您将其显示在您的域对象中。
如何查询属性?
如果不使用动态模式,Spring Data MongoDB参考文档中会清楚地解释嵌套属性的属性遍历。
如果您使用动态模式,则很可能使用基于MongoDBJSON的查询方法。

tsm1rwdh

tsm1rwdh3#

这让我很坚韧。如果你知道字段的键,另一个答案对通过哈希Map的字段值查询对象很有帮助。但是如果你不知道查询对象的键呢?我花了几个小时试图找出问题所在,即使我完全按照Noki的解释去做。在我的例子中,我有一个Customer类,它有一个hashmap字段来存储帐户对象。

public class Customer {
    private String firstName;
    private String lastName;
    private Map<String, Account> customerAccounts = new HashMap<>();

    //Constructors, getters, setters...
}

数据模型集合如下所示

{
        firstName: "firstname",
        lastName: "lastname",
        customerAccounts: {
             "0123456789": {
                firstName: "firstName",
                lastName: "lastname",
                accoutNumber: "0123456789",
                accountType: "Savings"
            },
            "1012234494": {
                firstName: "firstname",
                lastName: "lastname",
                accoutNumber: "1012234494",
                accountType: "Current"
            }
        }
    }

因此,我想通过customerAccounts中的account对象的accountNumber字段从数据库中查询客户。由于任何Customer中每个customerAcoounts对象中每个帐户的键都是唯一的和动态的,并且没有Customer集合与另一个Customer集合具有类似的accountNumber,因此您需要编写如下查询:

@Query(value = "{'customerAccount.?0.accountNumber' : ?0}"
Optional<Customer> findCustomerByCustomerAccount(String accountNumber);

“customerAccount.?0.accountNumber”中的?0将处理动态值,查找其键与传入参数完全匹配的对象,最后检查该帐户对象的accountNumber字段。

相关问题