匹配所有搜索字符串的Spring Data MongoDB elemMatch条件

ibrsph3r  于 2022-10-04  发布在  Spring
关注(0)|答案(1)|浏览(145)

我在使用MongoDB和Java进行定制的Spring Data 查询时遇到了问题。我正在尝试针对文档的大多数字段实现灵活的搜索功能。
该文档表示一个人,它包含一组嵌入其中的地址;该地址具有一个字段,该字段是一组字符串,即“街道地址行”。

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

搜索条件包括一组我想要与文档行匹配的街道行。如果在文档中找到搜索中的每一行,则应将条件视为匹配。

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

addressCriteriaList.add(Criteria.where("streetAddressLines").elemMatch(new Criteria().in(addressSearch.getStreetAddressLines())));

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

"streetAddressLines": [ "123 Main Street", "Apt 1" ]

搜索过程是这样的:

"streetAddressLines": [ "123 Main Street", "Apt 2" ]

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

我还尝试遍历每个搜索行,尝试一个elemMatch来查看文档中是否都有:

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);

这似乎行不通。我做了一些实验,可能这似乎不起作用:new criteria().is(L)

我试过了,这似乎确实管用,但我认为为每个搜索行创建一个集合真的效率很低:

streetAddressLines.forEach(l ->
                {
                    var list = new ArrayList<String>();
                    list.add(l);
                    addressCriteriaList.add(Criteria.where("streetAddressLines").elemMatch(new Criteria().in(l)));
                });

所以我不知道到底发生了什么--有人知道我做错了什么吗?先谢谢你。

r3i60tvu

r3i60tvu1#

您需要使用$all运算符或Criteria类的allmethod。大致是这样的:

addressCriteriaList.add(Criteria.where("streetAddressLines").all(addressSearch.getStreetAddressLines()));

如果addressSearch.getStreetAddressLines返回一个列表,请尝试执行以下操作:

addressCriteriaList.add(Criteria.where("streetAddressLines").all(addressSearch.getStreetAddressLines().toArray(new String[0])));

相关问题