在mongodb中,在简单的SQL中看起来几乎是自然的事情是不可能的。
给出一份简单的文件:
{
"total_units" : 100,
"purchased_unit" : 60
}我想查询集合,使用spring数据标准类,其中"total_units > purchased_units"。
据我所知,它应该和任何其他条件一样微不足道。
在Spring上没有发现任何支持这一点的东西。
发布于 2015-03-26 14:06:25
我认为Spring还不支持这一点,但是您可能需要将$where查询包装在Java原生DbObject中。注意,您的查询性能将受到相当大的损害,因为它会评估每条记录上的Javascript代码,因此,如果可能的话,将与索引查询结合起来。
原生Mongodb查询:
db.collection.find({ "$where": "this.total_units > this.purchased_units" });原生Java查询:
DBObject obj = new BasicDBObject();
obj.put( "$where", "this.total_units > this.purchased_units");在使用注意事项时,您必须查看一些$where
不要使用全局变量。 $where评估JavaScript,不能利用索引。因此,当使用标准MongoDB运算符(例如,$gt、$in)表示查询时,查询性能会提高。通常,只有当不能使用其他操作符表示查询时,才应该使用$where。如果必须使用$where,请尝试包括至少一个其他标准查询运算符来筛选结果集。单独使用$where需要对表进行扫描。使用正常的非$where查询语句可以提供以下性能优势: MongoDB将在$where语句之前计算查询的非$where组件。如果非$where语句不匹配文档,MongoDB将不会使用$where执行任何查询计算。非$where查询语句可以使用索引。
据我所知你不能做query.addCriteria(Criteria.where("total_units").gt("purchased_units"));
但是您的建议是创建一个额外的计算字段,比如computed_units,这是total_units和purchased_units之间的区别,然后您可以查询如下:
Query query = new Query();
query.addCriteria(Criteria.where("computed_units").gt(0));
mongoOperation.find(query, CustomClass.class);发布于 2015-08-05 22:05:54
您可以使用以下模式:
Criteria criteria = new Criteria() {
@Override
public DBObject getCriteriaObject() {
DBObject obj = new BasicDBObject();
obj.put("$where", "this.total_units > this.purchased_units");
return obj;
}
};
Query query = Query.query(criteria);发布于 2020-07-26 18:25:23
感谢安德鲁·奥尼斯琴科给出的历史性的好答案。
关于spring的最新版本-mongodb(例如。2.1.9.RELEASE),我必须编写如下相同的模式:
import org.bson.Document;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
// (...)
Criteria criteria = new Criteria() {
@Override
public Document getCriteriaObject() {
Document doc = new Document();
doc.put("$where", "this.total_units > this.purchased_units");
return doc;
}
};
Query query = Query.query(criteria);https://stackoverflow.com/questions/29279853
复制相似问题