Mongodb中,如何根据查询条件数组,匹配字段数组元素完全相等?即元素个数一样,元素内容一样,但元素的顺序可能不同。
考虑如下情况:
{
type: ["aaa", "bbb", "ccc"]
}
即查询条件 ["bbb", "aaa", "ccc"],["aaa", "bbb", "ccc"], ["ccc", "bbb", "aaa"]等均能匹配,但 ["aaa"], ["aaa", "bbb"]等情况不允许匹配。
我们可以利用mongodb的 all 运算来匹配数组,all 不需要顺序严格相同,但 all 有个问题,只要条件中的所有元素都在目标中就会匹配,因此如果数据中包含条件中的所有元素,且元素多余条件数组的数据也会匹配出来,我们可以结合size来限定数据中元素个数和条件中元素个数相同即可。
即:
db.collection.find(
{
"type": {
"$all": ["aaa", "bbb"],
"$size": 1
}
});
Java中的代码类似如下:
List<String> cond = new ArrayList<>();
cond.add("aaa");
cond.add("bbb"};
Criteria criteria = Criteria.where(type).all(cond).size(cond.size());
List<Xxx> list = mongoTemplate.find(new Query(criteria), Xxx.class);
上述方法就能严格完全匹配元素内容相同且忽略元素顺序了。