如何使用Spring数据从Mongo中的文档数组字段中仅获取匹配结果

我正在使用spring boot 1.5.1MongoDB version 3.4.6

我有一个mongo文件“ Hotel”,其中包含“ Review”列表。

Review类有属性userName

@Document

public class Hotel {

@Id

private String id;

private List<Review> reviews;

我想通过评论用户名搜索所有酒店。

HotelRepositorypublic List<Hotel> findByReviewsUserName(String

userName);

当我与“ Salman”用户通话时-

List<Hotel> list = this.hotelRepository.findByReviewsUserName(user);

此方法返回如下结果:

[

{

"id": "59b23c39c70ff63135f76b14",

"name": "Signature",

"reviews": [

{

"id": 1,

"userName": "Salman",

"rating": 8,

"approved": true

},

{

"id": 2,

"userName": "Shahrukh",

"rating": 5,

"approved": false

}

]

}

]

我只想对“ Salman”进行评论,但也给其他人带来了好处。

我缺少什么或怎么做?

回答:

命名查询应能正常工作。您并不是在明确地说您只需要文档的一部分,所以查询返回整个文档。要实现这一点, 您不能使用命名查询

但可以使用MongoTemplate旁边的MongoRepository。为此,您必须进行一些更改:

首先,您的存储库应如下所示:

public interface HotelRepository extends MongoRepository<Hotel, String>, MongoTemplateRepository {

// You can continue to write your named queries here. Spring will create that.

}

MongoTemplateRepository:

public interface MongoTemplateRepository {

// You will write your queries which will use mongoTemplate here.

List<Hotel> findByReviewsUserName(String userName);

}

为了实现MongoTemplateRepository方法,您将编写一个新类。 的是,您应该将此类命名为 。否则,spring-

data找不到您的方法实现在中定义的位置MongoTemplateRepository。因此,您的实现类的名称应为HotelRepositoryImpl

public class HotelRepositoryImpl implements MongoTemplateRepository {

@Autowired

private MongoTemplate mongoTemplate; // we will use this to query mongoDb

@Override

public List<Hotel> findByReviewsUserName(String userName) {

Query query = new Query();

query.addCriteria(Criteria.where("reviews.username").is(userName));

query.fields().include("reviews.$");

return mongoTemplate.find(query, Hotel.class);

}

}

用法:

hotelRepository.findByReviewsUserName("userName");

正如你可以看到我们可以代码.include().exclude用于查询的字段。当您只想包含数组字段的匹配部分时,我们将$运算符与数组字段名称一起使用。

您仍然可以使用受Spring数据良好支持的命名查询,此外,如果您需要对子文档进行

或某些复杂的查询,而这些子查询无法通过spring生成命名查询,则可以在新创建的mongoTemplate存储库类中进行。您可以从访问所有存储库方法HotelRepository

以上是 如何使用Spring数据从Mongo中的文档数组字段中仅获取匹配结果 的全部内容, 来源链接: utcz.com/qa/414322.html

回到顶部