2017-06-21 146 views
0
ArrayList<String> labels = (ArrayList) payload.get("labels"); 
Aggregation aggregation = newAggregation(
     match(Criteria.where("user_id").is(id).and("page_id").is(pageId).and("labels").in(labels)), 
       sort(Sort.Direction.DESC, "meta_data.user_data.time"), 
       group(Fields.fields().and("first_name", "$meta_data.user_data.first_name").and("last_name", "$meta_data.user_data.last_name").and("profile_pic", "$meta_data.user_data.profile_pic").and("user_id", "$user_id").and("labels", "$labels").and("access_times","$meta_data.access_times")) 
    ); 

AggregationResults<UsersMongoResult> groupResults = mongoTemplate.aggregate(aggregation, "chatuser_log", UsersMongoResult.class); 
于文件

标签阵列是这样的labels: ["123", "456"]检查阵列包含元素的MongoDB

当ArrayList的标签= [ “123”]结果匹配 但当ArrayList的标签= [ “123”, “789”]它也符合该文件。

如何克服这个问题?

回答

1

in-operator的文档:

如果字段保持的阵列,则在操作员将$选择其字段保存包含在指定的相匹配的值的至少一个元素的数组的文件阵列(例如,等)

如果你想匹配的是包含所有指定值的数组,你需要的all-operator

where("user_id").is(id).and("page_id").is(pageId).and("labels").all(labels))