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



我有一个实体的集合,看起来像这样:

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;
    ...
}

我有一个工作搜索,通过匹配"clientId"one_answers"name"找到ClientEntities:

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));
    ...
}

所以我的问题是,我如何扩展这个搜索,使它也匹配子实体列表中的"clientMachineId"?我尝试添加以下条件:

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

不能通过与DBRef链接的子实体中的字段进行查询。如果ClientMachineEntity将嵌入ClientMachine -,那么您可以根据需要使用点表示法或$elemMatch

在您的特定示例中-不能字段ClientMachineEntity.clientMachineId被保存为_id并用作主键?然后你可以得到你需要的结果-看看:如何查询mongodb与DBRef

我对Spring Data MongoDB开发的建议是-首先学习如何(如果可能的话)用MongoDB控制台用纯Javascript做,然后学习如何用Spring Data MongoDB做同样的事情。

相关内容

  • 没有找到相关文章

最新更新