首页  编辑  

Mongodb中匹配数组元素相等且忽略元素顺序

Tags: /Mongodb/   Date Created:
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);
上述方法就能严格完全匹配元素内容相同且忽略元素顺序了。