我的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
,仅返回“余额”大于零的记录?
答案 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
阶段,该阶段实际上可以过滤掉文档。
$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。