MongoDB Aggregation: $ Project (как использовать поле в другом поле того же конвейера проекции) - PullRequest
3 голосов
/ 12 марта 2019

Это то, что я хочу, чтобы мой конвейер агрегации выглядел, но я просто не знаю, как это правильно сделать

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

Я хочу использовать поля "resolled_bills" и "overdue_bills" внутри "Поле resolled_percentage"на том же конвейере проекции.Как?

Ответы [ 2 ]

1 голос
/ 12 марта 2019

Из того, что я вижу, я думаю, что вы хотите $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 документация для получения подробной информации о $ 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"}]   
       }
   }
}
])
0 голосов
/ 12 марта 2019

Так что я думаю, что я не могу использовать поля в других полях, которые сосуществуют в одном конвейере проекции.(предположим, что отрегулированные байты и овердейбиллс состоят не только из «размера», но и из длинных операторов запросов)

Я просто сделаю это вместо этого, поэтому я не буду повторять код в $ div.

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