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

Posted

技术标签:

【中文标题】由于添加多个条件 GridFSDBFile 查询时 com.mongodb.BasicDBObject 异常的限制【英文标题】:Due to limitations of the com.mongodb.BasicDBObject exception when add multiple criteria GridFSDBFile query 【发布时间】:2018-06-03 02:10:06 【问题描述】:

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

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

我的代码sn-p是

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();

【问题讨论】:

【参考方案1】:

您可以将方法更新到下面。您正在尝试提供多个 $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();

如果你需要明确的anding,你可以使用下面的代码

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

【讨论】:

可以确认这行得通。我尝试了一些非常相似的东西,但我不知道为什么它不起作用。可悲的是几天前,我不能被要求检查我当地的历史。关键是,您需要一个 Criteria[] Criteria.where(X).is(Y) 数组。一个查询,一个新的根空标准Criteria root = new Criteria,然后是query.addCriteria(root.andOperator(criteriaArray)),它就可以工作了。因此,我将通过将collect(toList()) 替换为toArray(Criteria[]::new) 来更改上述代码,以后不再使用toArray。无论哪种方式,很好的答案!

以上是关于由于添加多个条件 GridFSDBFile 查询时 com.mongodb.BasicDBObject 异常的限制的主要内容,如果未能解决你的问题,请参考以下文章

Rails 中的多个查询条件 - 如果它们存在。

配置数据源Where子句怎么添加多个查询条件并且用OR相连

sql语句中如何一个字段对查询出的多个值添加判断条件

如何使用方法语法在 LINQ 连接中添加多个条件

gridfsdbfile转为file 怎么获得byte

使用 Django 的 Case/When 查询集条件来设置多个值?