我想使用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->1
和a->2
键值对的文档但它最终检索两者,因为它看到它们都有'a'键的映射,并且都有值为1和2的映射。
我知道我可以使用简单的HashMap轻松替换Mapping
对象,但这并不能解决问题。