我有一组看起来像这样的实体:
public class ClientEntity {
@Id
private String id;
@Indexed(unique = true)
private String clientId;
private String name;
@DBRef
private List<ClientMachineEntity> machines;
...
}
... ClientMachineEntity的位置如下:
public class ClientMachineEntity {
@Id
private String id;
@Indexed(unique = true)
private String clientMachineId;
private String hostName;
...
}
我有一个工作搜索,通过匹配&#34; clientId&#34;找到ClientEntities。和&#34;名称&#34;:
public List<ClientEntity> searchByIdAndName(String id, String name) {
Criteria idCriteria = Criteria.where("clientId").regex(id, "i");
Criteria nameCriteria = Criteria.where("name").regex(name, "i");
Query query = new Query(new Criteria().orOperator(idCriteria, nameCriteria));
...
}
所以我的问题是,如何扩展此搜索,以便它与&#34; clientMachineId&#34;匹配?在子实体列表中?我尝试添加以下条件:
Criteria machineCriteria = Criteria.where("machines.clientMachineId").regex(id, "i");
......但这并不起作用,大概是因为机器是实体的列表,而不仅仅是一个子实体。
更新:看起来我正在寻找的是.elemMatch()功能,但是当我尝试这样做时:
Criteria machineCriteria = Criteria.where("machines").elemMatch(Criteria.where("clientMachineId").regex(id, "i"));
...我收到以下错误:
org.springframework.data.mapping.model.MappingException: No mapping metadata found for class com.mongodb.BasicDBObject
答案 0 :(得分:1)
您无法按与DBRef
关联的子实体中的字段进行查询。如果ClientMachineEntity
中嵌入ClientMachine
- 那么您可以根据需要使用点表示法或$elemMatch
。
在您的特定示例中 - 无法将字段ClientMachineEntity.clientMachineId
保存为_id并将其用作主键吗?然后,您可以获得所需的结果 - 请查看:How to query mongodb with DBRef
我对使用Spring Data MongoDB进行开发的建议是 - 首先学习如何(如果可能的话)在使用MongoDB控制台的普通Javascript中进行开发,然后学习如何使用Spring Data MongoDB进行相同操作。