2017-06-21 145 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))