首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用查询对象比较Spring数据MongoDB中的两个字段

如何使用查询对象比较Spring数据MongoDB中的两个字段
EN

Stack Overflow用户
提问于 2015-03-26 13:34:41
回答 4查看 6.6K关注 0票数 6

mongodb中,在简单的SQL中看起来几乎是自然的事情是不可能的。

给出一份简单的文件:

代码语言:javascript
运行
复制
{
    "total_units" : 100,
    "purchased_unit" : 60
}

我想查询集合,使用spring数据标准类,其中"total_units > purchased_units"

据我所知,它应该和任何其他条件一样微不足道。

在Spring上没有发现任何支持这一点的东西。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-03-26 14:06:25

我认为Spring还不支持这一点,但是您可能需要将$where查询包装在Java原生DbObject中。注意,您的查询性能将受到相当大的损害,因为它会评估每条记录上的Javascript代码,因此,如果可能的话,将与索引查询结合起来。

原生Mongodb查询:

代码语言:javascript
运行
复制
db.collection.find({ "$where": "this.total_units > this.purchased_units" });

原生Java查询:

代码语言:javascript
运行
复制
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_unitspurchased_units之间的区别,然后您可以查询如下:

代码语言:javascript
运行
复制
Query query = new Query();
query.addCriteria(Criteria.where("computed_units").gt(0));

mongoOperation.find(query, CustomClass.class);
票数 4
EN

Stack Overflow用户

发布于 2015-08-05 22:05:54

您可以使用以下模式:

代码语言:javascript
运行
复制
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);
票数 5
EN

Stack Overflow用户

发布于 2020-07-26 18:25:23

感谢安德鲁·奥尼斯琴科给出的历史性的好答案。

关于spring的最新版本-mongodb(例如。2.1.9.RELEASE),我必须编写如下相同的模式:

代码语言:javascript
运行
复制
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);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29279853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档