问题描述
如何对HazelcastJsonValue
使用聚合?
我正在尝试使用:
Long count = map1.aggregate(Aggregators.count(),e -> "name='John'".equals(e.getValue()));
Long count = map1.aggregate(Aggregators.count("name='John'"));
但是在两种情况下我都得到0,而实际结果应该是4。
这是示例代码:
HazelcastInstance hazelCast = Hazelcast.newHazelcastInstance();
IMap<String,HazelcastJsonValue> map1 = hazelCast.getMap("map1");
map1.put("1",new HazelcastJsonValue("{"name":"John","age":31,"city":"New York"}"));
map1.put("2","city":"New York"}"));
map1.put("3","city":"New York"}"));
map1.put("4","city":"New York"}"));
Long count = map1.aggregate(Aggregators.count(),e -> "name='John'".equals(e.getValue()));
Long count = map1.aggregate(Aggregators.count("name='John'"));
System.out.println(count);
解决方法
在我看来,谓词的格式不正确-在第一个谓词中,您将使用“等号”对整个JSON文档(多个字段)与文档的一部分进行比较,因此它永远不会匹配。
对我有用的是:
Config c = new Config();
HazelcastInstance hazelCast = Hazelcast.newHazelcastInstance(c);
IMap<String,HazelcastJsonValue> map1 = hazelCast.getMap("map1");
HazelcastJsonValue jsv = new HazelcastJsonValue("{\"name\":\"John\",\"age\":31,\"city\":\"New York\"}");
map1.put("A",jsv);
map1.put("B",jsv);
Predicate p = Predicates.equal("name","John");
long count = map1.aggregate(Aggregators.count(),p);
System.out.println("Count: " + count);
hazelCast.shutdown();