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_billslocal_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']   
       }
   }
}
])