由于 com.mongodb.BasicDBObject 添加多个条件 GridFSDBFile 查询时异常的限制

Ana*_*and 6 spring spring-mvc mongodb spring-data-mongodb spring-boot

我想在 GridFSDBFile 中添加多个条件,我已经迭代了地图并形成了条件对象,但我遇到了以下异常

由于 com.mongodb.BasicDBObject 的限制,您不能添加指定的第二个 '$and' 表达式。

我的代码片段是

public void getFile(Map<String, Object> metaData) throws Exception {
    Criteria criteria = new Criteria();
    metaData.forEach((k, v) -> criteria.andOperator(Criteria.where("metadata." + k).is(v)));
    GridFSDBFile gridFSDBFile = gridFsOperations.findOne(new Query(criteria));
    if (gridFSDBFile == null) {
        throw new HttpConflictException();
}
Run Code Online (Sandbox Code Playgroud)

use*_*814 10

您可以将方法更新到下面。您正在尝试提供多个$and操作员,每个操作员都有一个标准。

顺便说一句,当条件用逗号分隔时,您不需要显式anding,因为 mongodb 提供隐式anding。

public void getFile(Map<String, Object> metaData) throws Exception {
    Criteria criteria = new Criteria();
    metaData.forEach((k, v) -> criteria.and("metadata." + k).is(v));
    GridFSDBFile gridFSDBFile = gridFsOperations.findOne(new Query(criteria));
    if (gridFSDBFile == null) {
        throw new HttpConflictException();
}
Run Code Online (Sandbox Code Playgroud)

在需要显式anding 的情况下,可以使用以下代码

public void getFile(Map<String, Object> metaData) throws Exception {
    Criteria criteria = new Criteria();
     List<Criteria> andExpressions = metaData.entrySet().stream().
            map(kv -> Criteria.where("data." + kv.getKey()).is(kv.getValue())).
            collect(toList());
    Query andQuery = new Query();
    Criteria andCriteria = new Criteria();
    andQuery.addCriteria(andCriteria.andOperator(andExpressions.toArray(new Criteria[andExpressions.size()])));
    GridFSDBFile gridFSDBFile = gridFsOperations.findOne(andQuery);
    if (gridFSDBFile == null) {
        throw new HttpConflictException();
}
Run Code Online (Sandbox Code Playgroud)