MongoDB聚合:$ Project(如何在同一投影管道的另一个字段上使用字段)

问题描述 投票:3回答:2

这就是我希望我的聚合管道看起来,我只是不知道如何正确地做到这一点

db.Collection.aggregate([
{
   $project: {
      all_bills: ‘$all_count’,
      settled_bills: { $size: ’$settled’ },
      overdue_bills: { $size: ‘$overdue’ },
      settled_percentage: { $divide: [‘$settled_bills’, ‘$overdue_bills’] }
   }
}
])

我想在同一个投影管道上的“settle_percentage”字段中使用“settle_bills”和“overdue_bills”字段。如何?

mongodb aggregate projection
2个回答
1
投票

从我所看到的,我认为你想要$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表达式中使用$$作为前缀。

我希望这能够帮到你。

有关$ let的详细信息,请阅读MongoDb $let documentation

或者,您也可以这样做:

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"}]   
       }
   }
}
])

0
投票

所以我想我无法在同一投影管道上共存的其他领域使用字段。 (假设settle_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']   
       }
   }
}
])
© www.soinside.com 2019 - 2024. All rights reserved.