我在使用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)));
});
所以我不知道到底发生了什么--有人知道我做错了什么吗?先谢谢你。
1条答案
按热度按时间r3i60tvu1#
您需要使用
$all
运算符或Criteria
类的all
method。大致是这样的:如果
addressSearch.getStreetAddressLines
返回一个列表,请尝试执行以下操作: