在集合中,文档含有数组(List)字段,数组元素是内嵌对象(如 Group{server, group, pgroup})。需要查询:数组中存在“同一个元素”同时满足若干条件(如 server=xxx 且 group=yyy)。
public List<LdapUser> findByServerAndGroup(String server, String group) {
Criteria elem = Criteria.where("server").is(server)
.and("group").is(group);
Query query = new Query(Criteria.where("groups").elemMatch(elem));
return mongoTemplate.find(query, LdapUser.class, "ldap"); // collection 名按 @Document
}
Criteria.where("数组名").elemMatch(子条件)。server 与 group 必须来自同一个数组元素,避免“跨元素拼接”误命中。Query q = new Query(Criteria.where("groups")
.elemMatch(Criteria.where("server").is(server)
.and("group").is(group)));
boolean exists = mongoTemplate.exists(q, LdapUser.class);
long count = mongoTemplate.count(q, LdapUser.class);
pgroup)Criteria elem = Criteria.where("server").is(server)
.and("group").is(group)
.and("pgroup").is(pgroup);
Query q = new Query(Criteria.where("groups").elemMatch(elem));
server 属于集合 且 group 精确)Criteria elem = Criteria.where("server").in(servers)
.and("group").is(group);
Query q = new Query(Criteria.where("groups").elemMatch(elem));
Criteria elem = new Criteria().andOperator(
Criteria.where("server").regex("^prod-"),
Criteria.where("group").exists(true)
);
Query q = new Query(Criteria.where("groups").elemMatch(elem));