使用带有弹簧数据的QueryDSL创建$ elemMatch mongo查询

时间:2016-06-03 06:29:27

标签: mongodb spring-data querydsl

我想使用QueryDSL创建一个查询来替换它:

@Query(value = "{mappings: {$elemMatch: {'key': ?0, 'value': {$in: ?1}}}}")
List<MyObject> findByMapping(String key, Set<String> values);

MyObject是:

class MyObject {
  Set<Mapping> mappings;
}

Mapping是:

class Mapping {
  String key;
  String value;
}

我尝试使用.and()创建查询,但最终会将所有具有给定键的文档放在其映射中,并且任何键值对中的值不仅仅是那些具有匹配键的值。

例如:

{
  _id: 1,
  mappings: [{
    key: 'a', value: 1
  }, {
    key: 'b', value: 3
  }, {
    key: 'a', value: 2
  }]
},
{
  _id: 2,
  mappings: [{
    key: 'a', value: 3
  }, {
    key: 'b', value: 2
  }, {
    key: 'b', value: 1
  }]
}

如果我使用findByMapping("a", hashSet);致电hashSet.add(1) and hashSet.add(2)我希望它只检索第一个文档,因为它是唯一一个具有a->1a->2键值对的文档但它最终检索两者,因为它看到它们都有'a'键的映射,并且都有值为1和2的映射。

我知道我可以使用简单的HashMap轻松替换Mapping对象,但这并不能解决问题。

0 个答案:

没有答案