MongoDB Aggregation: $Project(如何在同一投影管道的另一个字段上使用一个字段)
MongoDB Aggregation: $Project (how to use a field on the other field of the same projection pipeline)
这就是我希望我的聚合管道看起来的样子,我只是不知道如何正确地做到这一点
db.Collection.aggregate([
{
$project: {
all_bills: ‘$all_count’,
settled_bills: { $size: ’$settled’ },
overdue_bills: { $size: ‘$overdue’ },
settled_percentage: { $divide: [‘$settled_bills’, ‘$overdue_bills’] }
}
}
])
我想在同一投影管道上使用“settled_percentage”字段中的 "settled_bills" 和 "overdue_bills" 字段。怎么做?
据我所见,我想你想要$let
。
您可以创建可在 $let
表达式中使用的局部变量。
试试这个:
db.Collection.aggregate([
{
$project: {
all_bills: ‘$all_count’,
settled_bills: { $size: ’$settled’ },
overdue_bills: { $size: ‘$overdue’ },
settled_percentage: {
$let : {
vars : {
local_settled_bills : { $size : "$settled"},
local_overdue_bills : { $size : "$overdue"}
},
in : {
$divide : ["$$local_settled_bills","$$local_overdue_bills"]
}
}
}
}
}
])
在这里,您在 vars
表达式中创建局部变量,它可以在内部使用(并且只能在 in
表达式内部使用)。我创建了 local_settles_bills
和 local_overdue_bills
,它们可以在 in
表达式中使用 $$
作为前缀。
希望对您有所帮助。
阅读 MongoDb $let documentation 了解有关 $let 的详细信息。
或者,您也可以这样做:
db.Collection.aggregate([
{
$project: {
all_bills: ‘$all_count’,
settled_bills: { $size: ’$settled’ },
overdue_bills: { $size: ‘$overdue’ },
settled_percentage: {
$divide : [{"$size" : "$settled_bills"},{"$size":"$overdue_bills"}]
}
}
}
])
所以我想我无法使用在同一投影管道中共存的其他字段上的字段。
(假设 settled_bills 和 overdue_bills 不仅包含 'size',还包含长查询运算符)
我只会这样做,所以我不会重复 $divide 上的代码。
db.Collection.aggregate([
{
$project: {
all_bills: ‘$all_count’,
settled_bills: { $size: ’$settled’ },
overdue_bills: { $size: ‘$overdue’ },
},
$project: {
settled_percentage: {
$divide : ['$settled_bills','$overdue_bills']
}
}
}
])
这就是我希望我的聚合管道看起来的样子,我只是不知道如何正确地做到这一点
db.Collection.aggregate([
{
$project: {
all_bills: ‘$all_count’,
settled_bills: { $size: ’$settled’ },
overdue_bills: { $size: ‘$overdue’ },
settled_percentage: { $divide: [‘$settled_bills’, ‘$overdue_bills’] }
}
}
])
我想在同一投影管道上使用“settled_percentage”字段中的 "settled_bills" 和 "overdue_bills" 字段。怎么做?
据我所见,我想你想要$let
。
您可以创建可在 $let
表达式中使用的局部变量。
试试这个:
db.Collection.aggregate([
{
$project: {
all_bills: ‘$all_count’,
settled_bills: { $size: ’$settled’ },
overdue_bills: { $size: ‘$overdue’ },
settled_percentage: {
$let : {
vars : {
local_settled_bills : { $size : "$settled"},
local_overdue_bills : { $size : "$overdue"}
},
in : {
$divide : ["$$local_settled_bills","$$local_overdue_bills"]
}
}
}
}
}
])
在这里,您在 vars
表达式中创建局部变量,它可以在内部使用(并且只能在 in
表达式内部使用)。我创建了 local_settles_bills
和 local_overdue_bills
,它们可以在 in
表达式中使用 $$
作为前缀。
希望对您有所帮助。
阅读 MongoDb $let documentation 了解有关 $let 的详细信息。
或者,您也可以这样做:
db.Collection.aggregate([
{
$project: {
all_bills: ‘$all_count’,
settled_bills: { $size: ’$settled’ },
overdue_bills: { $size: ‘$overdue’ },
settled_percentage: {
$divide : [{"$size" : "$settled_bills"},{"$size":"$overdue_bills"}]
}
}
}
])
所以我想我无法使用在同一投影管道中共存的其他字段上的字段。
(假设 settled_bills 和 overdue_bills 不仅包含 'size',还包含长查询运算符)
我只会这样做,所以我不会重复 $divide 上的代码。
db.Collection.aggregate([
{
$project: {
all_bills: ‘$all_count’,
settled_bills: { $size: ’$settled’ },
overdue_bills: { $size: ‘$overdue’ },
},
$project: {
settled_percentage: {
$divide : ['$settled_bills','$overdue_bills']
}
}
}
])