栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

@Query
批注的帮助下使用命名查询),但可以使用
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
方法,您将编写一个新类。 这里重要 的是,您应该将此类命名为 存储库类名称+
Impl
。否则,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



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/615491.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号