如何使用查询对象比较 Spring Data MongoDB 中的 2 个字段

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)


chr*_*dam 4

我认为 Spring Data API 尚不支持此功能,但您可能需要将查询包装$where在 Java 本机 DbObject 中。请注意,您的查询性能将受到相当大的影响,因为它会评估每条记录上的 Javascript 代码,因此如果可以的话,请与索引查询结合起来。

\n\n

原生 Mongodb 查询:

\n\n
db.collection.find({ "$where": "this.total_units > this.purchased_units" });\n
Run Code Online (Sandbox Code Playgroud)\n\n

原生 Java 查询:

\n\n
DBObject 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\n

MongoDB 将在 $where\n 语句之前评估查询的非 $where 部分。如果非 $where 语句与任何文档都不匹配,MongoDB\n 将不会使用 $where 执行任何查询评估。非$where\n 查询语句可以使用索引。

\n
\n\n

据我所知你不能这样做\nquery.addCriteria(Criteria.where("total_units").gt("purchased_units"));

\n\n

但会按照您的建议创建一个额外的计算字段,说这是和computed_units之间的差异,然后您可以查询为:total_unitspurchased_units

\n\n
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

  • 已经做了。不起作用。我想我错过了一些东西。不支持任何查询语言中如此基本的东西是没有任何意义的。 (3认同)