【问题标题】:How to get data with referenced object in Spring data mongo?如何在 Spring data mongo 中使用引用的对象获取数据?
【发布时间】:2019-10-02 16:29:59
【问题描述】:

这是我使用的City 文档类。

@Document("city")
public class City {
    @Id
    private String id;
    @Indexed(unique = true)
    private String name;
    @DBRef(lazy = true)
    private District district;

    public City() {
    }

    public City(String id) {
        this.id = id;
    }

    public City(String id, String name, District district) {
        this.id = id;
        this.name = name;
        this.district = district;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public District getDistrict() {
        return district;
    }

    public void setDistrict(District district) {
        this.district = district;
    }
}

这是District 文档类

@Document("district")
public class District {
    @Id
    private String id;
    @Indexed
    private String name;

    public District() {
    }

    public District(String id) {
        this.id = id;
    }

    public District(String id, String name) {
        this.id = id;
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

这是district收集数据。

/* 1 */
{
    "_id" : ObjectId("5d9482f3ff7ab743f0542070"),
    "name" : "Ampara",
    "_class" : "com.test.sample.model.District"
}

/* 2 */
{
    "_id" : ObjectId("5d9482f3ff7ab743f0542071"),
    "name" : "Anuradhapura",
    "_class" : "com.test.sample.model.District"
}

这是city收集数据。

/* 1 */
{
    "_id" : ObjectId("5d948333ff7ab743f0542089"),
    "name" : "Polgampola",
    "district" : {
        "$ref" : "district",
        "$id" : ObjectId("5d9482f3ff7ab743f0542070")
    },
    "_class" : "com.test.sample.model.City"
}

/* 2 */
{
    "_id" : ObjectId("5d948333ff7ab743f054208a"),
    "name" : "Porawagama",
    "district" : {
        "$ref" : "district",
        "$id" : ObjectId("5d9482f3ff7ab743f0542070")
    },
    "_class" : "com.test.sample.model.City"
}

/* 3 */
{
    "_id" : ObjectId("5d948333ff7ab743f054208b"),
    "name" : "Akkaraipattu",
    "district" : {
        "$ref" : "district",
        "$id" : ObjectId("5d9482f3ff7ab743f0542071")
    },
    "_class" : "com.test.sample.model.City"
}

这是上述城市文档类的存储库类

@Repository
public interface CityDao extends MongoRepository<City,String> {
    List<City> findByDistrict(String id);
}

在城市类中,我使用了名为District 的引用文档类。这是另一个文件。我需要得到属于一个地区的城市。 findByDistrict(String id) 方法不返回值。它只是返回空的List。那么我该怎么做呢?

【问题讨论】:

  • 您从哪里调用此存储库方法?你面临的具体问题是什么
  • 此方法从 CityService 类调用。问题是我正在处理 District 的参考对象。那是@DbRef 对象。在存储库中,我编写了一个自定义方法来让城市属于地区。但没有数据出来。
  • 把所有相关代码放在这里
  • @pvpkiran 我已经更新了问题。
  • 检查这个问题和我的答案stackoverflow.com/questions/58165835/…

标签: mongodb spring-boot spring-data spring-data-mongodb


【解决方案1】:

我尝试过另一种选择。正如@pvpkirn 所说,您不能使用@DBRef 查询。但我尝试使用MongoOperations。有了这个,我们可以将 Filter 对象作为 Json 对象传递。使用这个我得到了答案。这是我尝试过的。

public List<City> findByDistrictId(String districtId) {
        final Bson filter = eq("district.$id", new ObjectId(districtId));
        FindIterable<Document> documents = super.mongoOperations.getCollection("city").find(filter);
        List<City> cities = new ArrayList<>();
        for(Document document : documents){
            City city = new City(document.getObjectId("_id").toString(),document.getString("name"),new District(districtId));
            cities.add(city);
        }
        return cities;
    }

在这里我使用了com.mongodb.client.model.Filters.eq 来获取相关的bson 对象。

【讨论】:

    猜你喜欢
    • 2021-03-10
    • 1970-01-01
    • 2015-12-06
    • 2014-05-22
    • 2015-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多