您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

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

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

mongodb 2022/1/1 18:15:05 有511人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶