我已经开始了一个使用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.如何查询属性?
我可以这样做吗?
3条答案
按热度按时间ee7vknir1#
今天我在Spring Mongodb中遇到了一个Map查询问题,由于这个问题是谷歌中的第一个问题,我将提供另一个答案。
由于另一个答案引用了文档,而文档中没有很多信息,因此我将举一个例子来说明动态模式的@Query注解有多好:
此外,您还可以查询眼睛颜色:
正如其他答案文档所述,您可以过滤结果,只接收您喜欢的文档部分:
ao218c7q2#
我可以像以前那样在我的mongodb集合中Map属性吗(Map)
是的,您可以这样做,而且它可能证明对“dynamic“或“partly defined“模式有用(尽管很棘手)。
如果您事先知道您的模式,我强烈建议您将其显示在您的域对象中。
如何查询属性?
如果不使用动态模式,Spring Data MongoDB参考文档中会清楚地解释嵌套属性的属性遍历。
如果您使用动态模式,则很可能使用基于MongoDBJSON的查询方法。
tsm1rwdh3#
这让我很坚韧。如果你知道字段的键,另一个答案对通过哈希Map的字段值查询对象很有帮助。但是如果你不知道查询对象的键呢?我花了几个小时试图找出问题所在,即使我完全按照Noki的解释去做。在我的例子中,我有一个Customer类,它有一个hashmap字段来存储帐户对象。
数据模型集合如下所示
因此,我想通过customerAccounts中的account对象的accountNumber字段从数据库中查询客户。由于任何Customer中每个customerAcoounts对象中每个帐户的键都是唯一的和动态的,并且没有Customer集合与另一个Customer集合具有类似的accountNumber,因此您需要编写如下查询:
“customerAccount.?0.accountNumber”中的?0将处理动态值,查找其键与传入参数完全匹配的对象,最后检查该帐户对象的accountNumber字段。