当前位置: 首页 > 知识库问答 >
问题:

spring数据Mongo--如何按@dbref字段的id查询

令狐宏伟
2023-03-14

我是spring数据Mongo的新手,所以我肯定做错了什么,因为我无法执行这样一个简单的查询。这是我的模型:

@Document(collection="brands")
public class Brand{
    @Id
    private int id;

    private String name;
    ...
    //getters-setters
}

@Document(collection="models")
public class Model{
    @Id
    private int id;
    private String name;
    @DBRef
    private Brand brand;
    ...
    //getters-setters
}

我想从一个品牌获得所有的模型,所以我实现DAO如下:

@Repository
public interface IModelDAO extends MongoRepository<Model, Integer>{
    @Query(value="{ 'brand.$id' : ?0 }")
    public List<Model> findByBrandId(Integer id);   
}

如果我在shell中执行这个mongodb查询,它就会工作:db.models.find({'brand.$id':1})

但是,Java应用程序抛出以下异常:

Caused by: java.lang.IllegalAccessError
at org.springframework.data.mapping.PropertyReferenceException.detectPotentialMatches(PropertyReferenceException.java:134)

很明显,它在Brand类中查找一个字段$id,但由于它不存在,它失败了。因此,我将查询更改为以下内容,以便它导航到id字段:

@Query(value="{ 'brand.id' : ?0 }")

现在,它没有抛出异常,但在DB中没有找到任何东西。

中调试MongoTemplate.ExecuteFindMultiInterral()方法可以看到

DBCursor cursor = null;
    try {
        cursor = collectionCallback.doInCollection(getAndPrepareCollection(getDb(), collectionName));

游标的查询是query={“brand”:134}。所以它什么也找不到是有道理的。在调试期间将查询值更改为query={“brand.$id”:134}。

那么,为什么查询没有被正确翻译呢?

共有1个答案

龚凯泽
2023-03-14

问题是由@idint类型引起的。将其改为整数解决了问题:

@Document(collection="brands")
public class Brand{
    @Id
    private Integer id;

    private String name;
    ...
    //getters-setters
}

@Document(collection="models")
public class Model{
    @Id
    private Integer id;
    private String name;
    @DBRef
    private Brand brand;
    ...
    //getters-setters
}
 类似资料:
  • 我正在玩Spring数据Mongo查询,并想知道字段属性参数。以下是我从文档中获得的示例: 问题是:在{“firstname”:1,“lastname”:1}中,1的含义是什么?

  • 我写代码时遇到了麻烦,这将允许以一种简单明了的方式获取用户和索赔细节。这是我的MongoDB结构, 我的实体类是: 索赔类别: 我有一种方法可以按名称获取用户,如下所示, 如果我尝试使用这个方法,会得到一个错误, 找不到能够从类型<code>org.bson.types转换的转换器。ObjectId以键入 所以我更改了我的用户实体类,如下所示, 而不是

  • 每个人。在mongo组查询中,结果仅显示参数中的键。如何像mysql查询组一样保留每个组中的第一个文档。例如: 结果: 如何获取以下内容:

  • 我的应用程序使用Spring Boot/JPA/MongoDB。 我使用以下方法将域类映射到MongoDB 但找不到如何使我的DBRef字段唯一。

  • 假设我有一个这样的收藏: 我想找到所有包含一个子文档的文档,该子文档的=“b”和=2。 如果我做这样的查询: 它将返回集合中的所有文档,因为每个文档都包含一个子文档,该子文档的为“b”,或者为2。 我也试过: 它不会抛出任何错误,但不会返回任何结果。 如何在MongoDB中查询多个子文档字段?

  • 我使用的是Spring Boot 2.1.6和Elasticsearch 6.2.2 编辑以更好地澄清我的问题: 当我让Spring在我的存储库中使用以下方法为我生成查询时: 我想这意味着它将从索引中选择,然后按创建的降序排列结果,最后它将只返回第一个(最新)结果。 但索引中只有两个条目,相同的条目减去创建日期,该查询返回两个结果。我认为这意味着它不会转化为我所想的,而是会选择具有该ID的所有帐户