MongoDB строгая оценка состояния - PullRequest
0 голосов
/ 15 марта 2019

Мне интересно, если я делаю что-то не так, или MongoDB действительно строго оценивает обе ветви оператора $cond.Смотрите следующий пример:

db.collection.aggregate(
[  
   {  
      "$project":{ 
         "condition":{  
            "$cond":{  
               "if": true,
               "then":{  
                  "$literal":"NaN"
               },
               "else":{  
                  "$divide":[  
                     {  
                        "$literal":0.0
                     },
                     {  
                        "$literal":0.0
                     }
                  ]
               }
            }
         }
      }
   }
]

)

Эта агрегация должна, на мой взгляд, возвращать NaN (для каждого соответствующего документа), но вместо этого я получаю ошибку деления на ноль.Почему оценивается ветвь else условия, когда явно возвращается условие then?

Это происходит только в том случае, если я делю два $literal s, если один из операндов являетсяссылка на столбец, даже если столбец имеет значение 0, он работает как ожидалось.

1 Ответ

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

Прежде всего нет необходимости использовать $literal.

db.collection.aggregate(
[  
   {  
      "$project":{ 
         "condition":{  
            "$cond":{  
               "if": true,
               "then": "NaN",
               "else":{ "$divide":[ 0.0, 0.0] }
            }
         }
      }
   }
]

)

делает то же самое.

Теперь об ошибке. "$divide":[ 0.0, 0.0] имеет 2 константы и рассчитывается перед запуском запроса на клиенте, что выглядит справедливой оптимизацией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...