在 MongoDB 视图聚合中使用 $gt 运算符

Posted

技术标签:

【中文标题】在 MongoDB 视图聚合中使用 $gt 运算符【英文标题】:Using $gt Operator in MongoDB View Aggregation 【发布时间】:2018-10-03 19:31:54 【问题描述】:

我的 MongoDB 后端有一个聚合管道,它经过多个步骤,最后一个是 $project,如下所示:


  "_id": 1.0,
  "visit": 
    "_id": 1.0,
    "service": 1.0,
    "dateOfVisit": 1.0,
    "type": 1.0
  ,
  "customer": 
    "_id": 1.0,
    "name": 1.0
  ,
  "staffPerson": 
    "_id": 1.0,
    "name": 1.0
  ,
  "balance": 1.0,
  "updatedAt": 1.0

我现在要做的是将其限制为“余额”> 0 的记录。换句话说,我只想返回有余额到期的记录。我试过这样做:


  "_id": 1.0,
  "visit": 
    "_id": 1.0,
    "service": 1.0,
    "dateOfVisit": 1.0,
    "type": 1.0
  ,
  "customer": 
    "_id": 1.0,
    "name": 1.0
  ,
  "staffPerson": 
    "_id": 1.0,
    "name": 1.0
  ,
  "balance":  $gt : 0 ,
  "updatedAt": 1.0

但这给了我这个错误信息:

表达式 $gt 正好有 2 个参数。 1个被传入。

然后我尝试了这个:

    
      "_id": 1.0,
      "visit": 
        "_id": 1.0,
        "service": 1.0,
        "dateOfVisit": 1.0,
        "type": 1.0
      ,
      "customer": 
        "_id": 1.0,
        "name": 1.0
      ,
      "staffPerson": 
        "_id": 1.0,
        "name": 1.0
      ,
      "balance":  $gt : 0, 1.0 ,
      "updatedAt": 1.0
    

但这又给我带来了另一个错误,关于字段名称需要用引号引起来。所以看起来我的语法在这里不正确。

我也尝试传入一个包含两个值的数组:

 $gt: [ <expression1>, <expression2> ] 

但这会返回一个布尔值,而不是实际值。

如何在此处使用$gt,仅返回“余额”大于零的记录?

【问题讨论】:

您是否尝试在$project 步骤中执行$gt?还是在上一步中? 在 $project 步骤中。我需要在不同的步骤中执行此操作吗? 【参考方案1】:

有(至少)2 种不同的$gt 用法:

$gt (comparison query operator) $gt (aggregation)

$project 上下文中,您使用的是聚合运算符。聚合运算符将返回 true/false 并接受一个包含 2 个参数的数组来进行操作。一个示例用法是:

db.coll.aggregate([
    
        $project:
            _id:1,
            balance: 
                $gt: ["balance", 0]
            
        
    
]);

那会吐出来:

_id: "SOME_ID_0", balance: true
_id: "SOME_ID_1", balance: false
_id: "SOME_ID_2", balance: false

你不想这样。您实际上希望过滤余额小于0 的项目。为此,您应该包含一个 $match 阶段,它实际上可以过滤掉文档。

$matchquery 对象作为参数。这意味着您可以使用$gt 查询运算符

考虑到这一点,您的示例将如下所示:

db.coll.aggregate([
    
        $match: // Filter documents that don't have balance > 0
            balance: 
                $gt: 0
            
        
    ,
    
        $project: // Project documents in this format
            _id: 1,
            balance: 1
        
    
]);

另请参阅此答案:mongodb aggregation filter for records with a field greater than or equal to a number。

【讨论】:

我也尝试过这样的事情。但它给了我一个布尔值“真”或“假”,而不是实际数量。 @Muirik 我认为这可能是正确的方法。使用$match,然后使用$project

以上是关于在 MongoDB 视图聚合中使用 $gt 运算符的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB聚合使用表达式运算符(函数)分组按条件计数统计案例一则

用于算术运算的 MongoDB 聚合 - 子文档字段

MongoDB聚合结果输出到新的集合方法与案例实践

MongoDB聚合结果输出到新的集合方法与案例实践

MongoDb 聚合 $match 错误:“参数必须是聚合管道运算符”

MongoDB Mongoose 聚合/数学运算