场景

在集合中,文档含有数组(List)字段,数组元素是内嵌对象(如 Group{server, group, pgroup})。需要查询:数组中存在“同一个元素”同时满足若干条件(如 server=xxxgroup=yyy)。


推荐写法:$elemMatch(确保同一元素匹配)

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
}

变体与常用操作

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);
Criteria elem = Criteria.where("server").is(server)
	.and("group").is(group)
	.and("pgroup").is(pgroup);
Query q = new Query(Criteria.where("groups").elemMatch(elem));
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));