【问题标题】:Using $gt Operator in MongoDB View Aggregation在 MongoDB 视图聚合中使用 $gt 运算符
【发布时间】: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 步骤中。我需要在不同的步骤中执行此操作吗?

标签: javascript mongodb aggregation


【解决方案1】:

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

$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
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-28
  • 1970-01-01
  • 2016-09-11
  • 2017-05-21
  • 2016-04-10
相关资源
最近更新 更多