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