在MongoDB View Aggregation中使用$ gt运算符

时间:2018-04-23 17:06:14

标签: javascript mongodb aggregation

我的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
}

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

{
  "_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,仅返回“余额”大于零的记录?

1 个答案:

答案 0 :(得分: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