如何查询找到子实体列表包含与字符串匹配的字段的mongo实体?

时间:2014-03-14 17:17:29

标签: mongodb mongodb-query spring-data-mongodb

我有一组看起来像这样的实体:

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

1 个答案:

答案 0 :(得分:1)

您无法按与DBRef关联的子实体中的字段进行查询。如果ClientMachineEntity中嵌入ClientMachine - 那么您可以根据需要使用点表示法或$elemMatch

在您的特定示例中 - 无法将字段ClientMachineEntity.clientMachineId保存为_id并将其用作主键吗?然后,您可以获得所需的结果 - 请查看:How to query mongodb with DBRef

我对使用Spring Data MongoDB进行开发的建议是 - 首先学习如何(如果可能的话)在使用MongoDB控制台的普通Javascript中进行开发,然后学习如何使用Spring Data MongoDB进行相同操作。