javascript - 在 MongoDB View 聚合中使用 $gt 运算符

标签 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
}

我现在要做的是将此限制为“余额”> 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
}

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

Expression $gt takes exactly 2 arguments. 1 were passed in.

然后我尝试了这个:

    {
      "_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> ] }

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

我如何在这里使用 $gt,只返回“余额”大于零的记录?

最佳答案

有(至少)两种不同的$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实际上可以过滤掉文档的阶段。

$match 需要一个 query对象作为参数。这意味着您可以使用 $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 .

关于javascript - 在 MongoDB View 聚合中使用 $gt 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49986413/

相关文章:

c# - Visual Studio Lightswitch,创建自动更新浏览屏幕的搜索参数?

javascript - 使用提交按钮进行 jquery 表单验证

python - PyMongo 抛出 "E11000 duplicate key error index"

mongodb 恢复删除的记录

c# - MSBuild失败: IsOsPlatform not found

javascript - 无法访问输入文本字段值 jQuery

javascript - ReactDOM.renderToString sessionStorage 未定义,window 未定义

sorting - 在Elasticsearch中获取每组的前n个值

elasticsearch - 在ElasticSearch中过滤嵌套的聚合?

java - 组合和聚合关系 UML 存在问题