Han*_*ket 5 java mongodb spring-data spring-data-mongodb
在简单的 SQL 中看似自然的事情在mongodb
.
给定一个简单的文档:
{
"total_units" : 100,
"purchased_unit" : 60
}
Run Code Online (Sandbox Code Playgroud)
我想使用 spring 数据 Criteria 类查询集合,其中"total_units > purchased_units"
.
据我了解,它应该与任何其他条件一样微不足道。
在 Spring api 上找不到任何支持此功能的内容。
小智 5
您可以使用以下模式:
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);
Run Code Online (Sandbox Code Playgroud)
我认为 Spring Data API 尚不支持此功能,但您可能需要将查询包装$where
在 Java 本机 DbObject 中。请注意,您的查询性能将受到相当大的影响,因为它会评估每条记录上的 Javascript 代码,因此如果可以的话,请与索引查询结合起来。
原生 Mongodb 查询:
\n\ndb.collection.find({ "$where": "this.total_units > this.purchased_units" });\n
Run Code Online (Sandbox Code Playgroud)\n\n原生 Java 查询:
\n\nDBObject obj = new BasicDBObject();\nobj.put( "$where", "this.total_units > this.purchased_units");\n
Run Code Online (Sandbox Code Playgroud)\n\n使用时必须注意的一些注意事项$where
:
\n\n\n不要使用全局变量。
\n\n$where 计算 JavaScript 并且无法利用索引。\n 因此,当您使用标准 MongoDB 运算符(例如 $gt、$in)表达查询时,查询性能会提高。一般来说,仅当您无法使用另一个运算符表达查询时,才应使用 $where。如果必须使用 $where,请尝试至少包含一个其他\n 标准查询运算符来过滤结果集。单独使用 $where\n 需要进行表扫描。使用普通的非 $where 查询语句\n 可提供以下性能优势:
\n\nMongoDB 将在 $where\n 语句之前评估查询的非 $where 部分。如果非 $where 语句与任何文档都不匹配,MongoDB\n 将不会使用 $where 执行任何查询评估。非$where\n 查询语句可以使用索引。
\n
据我所知你不能这样做\nquery.addCriteria(Criteria.where("total_units").gt("purchased_units"));
但会按照您的建议创建一个额外的计算字段,说这是和computed_units
之间的差异,然后您可以查询为:total_units
purchased_units
Query query = new Query();\nquery.addCriteria(Criteria.where("computed_units").gt(0));\n\nmongoOperation.find(query, CustomClass.class);\n
Run Code Online (Sandbox Code Playgroud)\n
归档时间: |
|
查看次数: |
5080 次 |
最近记录: |