我对使用MongoDb和Java的自定义Spring数据查询有问题。我试图针对文档的大部分字段实现灵活的搜索功能。
此文档表示一个人,它包含嵌入其中的一组地址;该地址有一个字段,该字段是一组字符串,这些字符串是“街道地址线”。
我从示例开始查询,这适用于单个字段。但不适用于其他类型,例如这组字符串。对于这些,我正在构建自定义标准。
搜索标准包括一组我希望与文档的线条相匹配的街道线。如果搜索中的每一行都在文档中找到,则应将标准视为匹配。
我尝试过使用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);
这似乎不管用。我做了一些实验,可能这似乎不起作用:新标准().is(L)
我尝试过这样做,但我认为为每个搜索行创建一个集合是非常低效的:
streetAddressLines.forEach(l ->
{
var list = new ArrayList<String>();
list.add(l);
addressCriteriaList.add(Criteria.where("streetAddressLines").elemMatch(new Criteria().in(l)));
});
所以我不知道到底是怎么回事--有人知道我做错了什么吗?提前谢谢。
发布于 2022-10-02 11:14:25
您需要使用$all
运算符或all
方法 of Criteria
类。类似于这样的东西:
addressCriteriaList.add(Criteria.where("streetAddressLines").all(addressSearch.getStreetAddressLines()));
如果addressSearch.getStreetAddressLines
返回一个列表,请尝试如下:
addressCriteriaList.add(Criteria.where("streetAddressLines").all(addressSearch.getStreetAddressLines().toArray(new String[0])));
https://stackoverflow.com/questions/73923299
复制相似问题