在实际项目中,查询数据时,有以下两种条件我们经常会遇到:①查询参数是list类型,判断某个字段(String)是不是在这个list之中。②查询参数是一个String类型,判断这个参数是不是在某个字段(list)之中。详细地:
1、$in
针对条件①,比如某页面的列表筛选条件中有个所属项目的条件,是支持多选的,那么自然到后端是list类型的ids。或者类似的场景还有一些状态的条件。此时,对应的mongo操作数是in查询,如下。
public Pager<Topic> getTopicPageByIds(String teamId, List<String> ids, PageRequest pageRequest){
return createQuery()
.where()
.in("_id", ids)
.eq("teamId", teamId)
.getPagedList(pageRequest.toPager(), clazz);
}
关于$in,官方文档描述是:
The $in operator selects the documents where the value of a field equals any value in the specified array.
即,$in运算符会筛选出字段值等于指定数组中任何值的文档。
详见:https://docs.mongodb.com/manual/reference/operator/query/in/
注意:
$in的查询条件(指输入参数ids)是数组,但字段值(指表中字段)却不一定只能是数组中的值,也可以是数组。例如查询条件数组为["苹果", "西瓜"],字段值为苹果,则能匹配到该条数据(如上述例子)。但若字段值为["苹果", "梨子"],此时也能匹配到该条数据,因为苹果在["苹果", "西瓜"]之中。
2、$eq
针对条件②,比如有一个项目表,其中有个memberIds的字段,该字段用于存放参与该项目的所有成员。那么在项目列表中,我肯定只能查看到我参与的项目相关信息,而不能看到与我无关的项目。此时,对应的mongo操作数是eq查询,如下。
public Pager<Project> getProjectPage(String key, PageRequest pageRequest, String staffId){
return createQuery()
.where()
.like("name", key)
.eq("memberIds", staffId)
.getPagedList(pageRequest.toPager(), clazz);
}
关于$eq,官方文档描述是:
Specifies equality condition. The $eq operator matches documents where the value of a field equals the specified value.
即,指定相等条件。$eq运算符将匹配字段值等于指定值的文档。
详见:https://docs.mongodb.com/manual/reference/operator/query/eq/