首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >匹配所有搜索字符串的Spring数据MongoDb elemMatch条件

匹配所有搜索字符串的Spring数据MongoDb elemMatch条件
EN

Stack Overflow用户
提问于 2022-10-02 03:59:55
回答 1查看 137关注 0票数 1

我对使用MongoDb和Java的自定义Spring数据查询有问题。我试图针对文档的大部分字段实现灵活的搜索功能。

此文档表示一个人,它包含嵌入其中的一组地址;该地址有一个字段,该字段是一组字符串,这些字符串是“街道地址线”。

我从示例开始查询,这适用于单个字段。但不适用于其他类型,例如这组字符串。对于这些,我正在构建自定义标准。

搜索标准包括一组我希望与文档的线条相匹配的街道线。如果搜索中的每一行都在文档中找到,则应将标准视为匹配。

我尝试过使用elemMatch,但这并不完全像我想要的那样工作:

代码语言:javascript
运行
复制
    addressCriteriaList.add(Criteria.where("streetAddressLines").elemMatch(new Criteria().in(addressSearch.getStreetAddressLines())));

如果文档中只有一行与搜索匹配,这似乎是匹配的。如果我有以下文件:

代码语言:javascript
运行
复制
"streetAddressLines": [ "123 Main Street", "Apt 1" ]

搜索结果如下:

代码语言:javascript
运行
复制
"streetAddressLines": [ "123 Main Street", "Apt 2" ]

elemMatch成功了,但这不是我想要的。

我还试过遍历每个搜索行,尝试使用一个elemMatch来查看文档中是否包含每一行:

代码语言:javascript
运行
复制
var addressLinesCriteriaList = new Array<Criteria>();
var streetAddressLines = address.getStreetAddressLines();
streetAddressLines.forEach(l ->  addressLinesCriteriaList.add(Criteria.where("streetAddressLines").elemMatch(new Criteria().is(l))))

var matchCriteria = new Criteria.andOperator(addressLinesCriteriaList);

这似乎不管用。我做了一些实验,可能这似乎不起作用:新标准().is(L)

我尝试过这样做,但我认为为每个搜索行创建一个集合是非常低效的:

代码语言:javascript
运行
复制
        streetAddressLines.forEach(l ->
                {
                    var list = new ArrayList<String>();
                    list.add(l);
                    addressCriteriaList.add(Criteria.where("streetAddressLines").elemMatch(new Criteria().in(l)));
                });

所以我不知道到底是怎么回事--有人知道我做错了什么吗?提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-02 11:14:25

您需要使用$all运算符或all 方法 of Criteria类。类似于这样的东西:

代码语言:javascript
运行
复制
addressCriteriaList.add(Criteria.where("streetAddressLines").all(addressSearch.getStreetAddressLines()));

如果addressSearch.getStreetAddressLines返回一个列表,请尝试如下:

代码语言:javascript
运行
复制
addressCriteriaList.add(Criteria.where("streetAddressLines").all(addressSearch.getStreetAddressLines().toArray(new String[0])));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73923299

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档