由于添加多个条件 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
运算符,每个运算符都有一个条件。
顺便说一句,您不需要显式的and
ing,因为当标准用逗号分隔时,mongodb 会提供隐式的and
ing。
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();
如果你需要明确的and
ing,你可以使用下面的代码
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 异常的限制的主要内容,如果未能解决你的问题,请参考以下文章