在 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
用法:
在$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。
【讨论】:
我也尝试过这样的事情。但它给了我一个布尔值“真”或“假”,而不是实际数量。 @Muirik 我认为这可能是正确的方法。使用$match
,然后使用$project
。以上是关于在 MongoDB 视图聚合中使用 $gt 运算符的主要内容,如果未能解决你的问题,请参考以下文章
MongoDB聚合使用表达式运算符(函数)分组按条件计数统计案例一则