当前位置: 首页 > 知识库问答 >
问题:

比较2个字段时的MongoDb查询条件

司寇羽
2023-03-14

我有一个集合T,有两个字段:Grade1Grade2,我想选择条件为Grade1>的字段; Grade2,我怎样才能像在MySQL中一样获得查询?

Select * from T Where Grade1 > Grade2

共有3个答案

阙博容
2023-03-14

如果查询仅由$where运算符组成,则可以只传入JavaScript表达式:

db.T.find("this.Grade1 > this.Grade2");

为了获得更高的性能,请运行一个具有$redact管道的聚合操作,以筛选满足给定条件的文档。

$redact管道合并了$project$match的功能,以实现字段级编辑,在此管道中,它将使用$$keep返回所有匹配条件的文档,并使用$$prune变量从管道结果中删除那些不匹配的文档。

运行以下聚合操作比对大型集合使用$Where更有效地筛选文档,因为它使用单个管道和本机MongoDB运算符,而不是使用$Where的JavaScript计算,后者会降低查询速度:

db.T.aggregate([
    {
        "$redact": {
            "$cond": [
                { "$gt": [ "$Grade1", "$Grade2" ] },
                "$$KEEP",
                "$$PRUNE"
            ]
        }
    }
])

这是合并两个管道$project$match的更简化版本:

db.T.aggregate([
    {
        "$project": {
            "isGrade1Greater": { "$cmp": [ "$Grade1", "$Grade2" ] },
            "Grade1": 1,
            "Grade2": 1,
            "OtherFields": 1,
            ...
        }
    },
    { "$match": { "isGrade1Greater": 1 } }
])

对于MongoDB3.4及更新版本:

db.T.aggregate([
    {
        "$addFields": {
            "isGrade1Greater": { "$cmp": [ "$Grade1", "$Grade2" ] }
        }
    },
    { "$match": { "isGrade1Greater": 1 } }
])
洪昱
2023-03-14

您可以使用$expr(3.6mongo版本运算符)在常规查询中使用聚合函数。

比较查询运算符聚合比较运算符

常规查询:

db.T.find({$expr:{$gt:["$Grade1", "$Grade2"]}})

聚合查询:

db.T.aggregate({$match:{$expr:{$gt:["$Grade1", "$Grade2"]}}})
梅跃
2023-03-14

您可以使用$WHERE。 请注意,它将相当慢(必须对每个记录执行Javascript代码),因此如果可以,请与索引查询结合使用。

db.T.find( { $where: function() { return this.Grade1 > this.Grade2 } } );

或更紧凑:

db.T.find( { $where : "this.Grade1 > this.Grade2" } );

您可以使用$expr,如最近回答中所述

 类似资料:
  • 我知道可以使用,现在不推荐使用。类似于咆哮的代码: 另外,也许可以将手动脚本写成字符串,但我怀疑这是否是正确的解决方案。任何创建正确查询的想法都将受到欢迎。

  • 问题内容: 我的Firestore集合的文档带有字符串字段,该字段可以为 null 。 我期望如果我查询: 我将获取“ producedDate”早于“ 2018-10-15”的所有产品,包括那些“ producedDate”为空的产品。 但是实际上我没有得到s。 这是故意的还是一个错误? 问题答案: 它打算以这种方式工作。该文档指出: 当查询涉及具有 混合类型值的 字段时,Cloud Fires

  • 问题内容: 在我的收藏夹中,每个文档都有2个修改和同步的日期。我想查找已修改>同步,或不存在同步的内容。 我试过了 但没有显示我的期望。有任何想法吗? 谢谢 问题答案: 您不能将一个字段与具有正常查询匹配的另一个字段的值进行比较。但是,您可以使用聚合框架执行此操作: 我在其中输入“您的其他常规查询”,因为您可以使该位使用索引。因此,如果您只想对该字段所在的文档执行此操作,则可以执行以下操作: 用输

  • 本文向大家介绍根据两个条件更新MongoDB中指定字段的查询,包括了根据两个条件更新MongoDB中指定字段的查询的使用技巧和注意事项,需要的朋友参考一下 为此,请使用UPDATE()方法,并在其中设置两个条件。让我们创建一个包含文档的集合- 在find()方法的帮助下显示集合中的所有文档- 这将产生以下输出; 以下是根据两个条件更新MongoDB中数量的查询- 在find()方法的帮助下显示集合

  • 我正在通过猫鼬使用MongoDB。 > MongoDB是执行集合扫描还是索引有助于提高查询效率?查询是否与仅使用id字段有任何不同? 如果MongoDB在您查询非索引字段时进行集合扫描。如果集合扫描完全相同,查询多个非索引字段是否会加快查询速度?假设我查询五个非索引字段而不是两个(都返回相同的文档)。两个查询是否都进行相同的集合扫描?

  • 问题内容: 我有要查询的模型(称为“活动”)(使用Mongoose)。他们的架构如下所示: 当我询问他们,我填充,,,和字段(所有引用)。在那之后,我也深入了这个领域。这是我的查询代码: 这已经是一个相对复杂的查询,但是我需要做更多。如果它碰到了声明的一部分,我 还 需要确保的字段等于字符串。我尝试使用,但是由于必须先填充事件,因此无法查询其任何字段。我还需要在其他多个查询中实现相同的目标。 如我

  • 问题内容: 我想知道如何比较两个不同的数据库 表记录 。我的意思是,我将比较两个数据库表,它们可能具有不同的列名但具有相同的数据。但是其中一个表可能比另一个表具有更多的记录,因此我想看看这两个表之间的区别是什么。为此,如何编写sql查询?仅供参考:这两个数据库都在同一个SQL Server实例下。 然后,在比较表1和表2之后,它应该 从 表2返回 Ruby Core。 问题答案: 如果执行从T1到

  • 问题内容: 我一直认为您可以在语句中使用它来查询MySQL中的内容。因此,如果我想将一行中的多个字段与1个关键字或字词进行比较: 如果我有一系列要比较的单词: 我不相信语法是正确的。除了类似的东西,是否有一种有效的方法可以编写此代码: 我能正确处理吗? 问题答案: 用这个::